Files
2024-02-08 12:07:49 -07:00

1782 lines
63 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/*===============================================*\
|| ############################################# ||
|| # JAKWEB.CH / Version 2.1.4 # ||
|| # ----------------------------------------- # ||
|| # Copyright 2023 JAKWEB All Rights Reserved # ||
|| ############################################# ||
\*===============================================*/
//Import the PHPMailer class into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\OAuth;
//Alias the League Google OAuth2 provider class
use League\OAuth2\Client\Provider\Google;
//@see https://github.com/stevenmaguire/oauth2-microsoft
use Stevenmaguire\OAuth2\Client\Provider\Microsoft;
//@see https://github.com/greew/oauth2-azure-provider
use Greew\OAuth2\Client\Provider\Azure;
//@see https://packagist.org/packages/hayageek/oauth2-yahoo
use Hayageek\OAuth2\Client\Provider\Yahoo;
// Redirect to something...
function jak_redirect($url, $code = 302) {
header('Location: '.html_entity_decode($url), true, $code);
exit;
}
// Filter inputs
function jak_input_filter($value) {
$value = filter_var($value, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
return preg_replace("/[^0-9 _,.@\-\p{L}]/u", '', $value);
}
// filter url inputs
function jak_url_input_filter($value) {
if (!is_array($value)) {
$value = html_entity_decode($value);
$value = preg_replace('/[^\w\-.]/', '', $value);
}
return trim(filter_var($value, FILTER_SANITIZE_FULL_SPECIAL_CHARS));
}
// Check if userid can have access to the pages.
function jak_get_access($page, $array, $superoperator = false) {
$roles = explode(',', $array);
if ((is_array($roles) && in_array($page, $roles)) || $superoperator) {
return true;
}
}
// Check if row exist with custom field
function jak_field_not_exist($check, $table, $field) {
global $jakdb;
if ($jakdb->has($table, [$field => $check])) {
return true;
}
}
// Check if row exist with id
function jak_field_not_exist_id($lsvar,$id,$table,$lsvar3) {
global $jakdb;
if ($jakdb->has($table, ["AND" => ["id[!]" => $id, $lsvar3 => $lsvar]])) {
return true;
}
}
// Replace urls for email full path
function replace_urls_emails($string, $base_url, $folder) {
$string = str_replace('/'.$folder.'/', $base_url.'/'.$folder.'/', $string );
return $string;
}
// Get the data only per ID (e.g. edit single user, edit category)
function jak_get_data_front($id, $opid, $table) {
global $jakdb;
$datasett = $jakdb->get($table, "*", ["AND" => ["id" => $id, "opid" => $opid, "active" => 1]]);
return $datasett;
}
// Get the data only per ID (e.g. edit single user, edit category)
function jak_get_data($id, $opid, $table) {
global $jakdb;
if (!isset($opid) || empty($opid)) $opid = 0;
$datasett = $jakdb->get($table, "*", ["AND" => ["id" => $id, "opid" => $opid]]);
return $datasett;
}
// Check if row exist
function jak_row_exist($id, $opid, $table) {
global $jakdb;
if ($jakdb->has($table, ["AND" => ["id" => $id, "opid" => $opid]])) {
return true;
}
}
// Get a clean name for the string
function jak_clean_string($string) {
// Remove all spaces
$string = str_replace(' ', '_', $string); // Replaces all spaces with hyphens.
// all lower case
$string = strtolower($string);
// return
return preg_replace('/[^a-z0-9\_]/', '', $string); // Removes special chars.
}
// Write the tags
function jak_insert_update_tags($opid, $field, $id, $tags) {
global $jakdb;
if (empty($tags)) {
// Delete all entries if we have none
$jakdb->delete("tags", ["AND" => ["opid" => $opid, $field => $id]]);
} else {
// Make an array
$tags = explode(',', $tags);
// Get all operators in cc
$currenttags = $jakdb->select("tags", "tagname", ["AND" => ["opid" => $opid, $field => $id]]);
// We check the difference
$tagremove = array_diff($currenttags, $tags);
$tagadd = array_diff($tags, $currenttags);
// We run the foreach to remove
if (!empty($tagremove)) foreach ($tagremove as $or) {
$jakdb->delete("tags", ["AND" => ["opid" => $opid, $field => $id, "tagname" => $or]]);
}
if (!empty($tagadd)) foreach ($tagadd as $oa) {
$jakdb->insert("tags", ["opid" => $opid, $field => $id, "tagname" => $oa, "created" => $jakdb->raw("NOW()")]);
}
}
return true;
}
// Get the tags
function jak_get_tags($opid, $field, $id) {
global $jakdb;
$tags = $jakdb->select("tags", "tagname", ["AND" => ["opid" => $opid, $field => $id]]);
if (!empty($tags)) {
return implode(',', $tags);
} else {
return "";
}
}
// Get the tags on the front end
function jak_get_tags_frontend($opid, $field, $id) {
global $jakdb;
$tags = $jakdb->select("tags", "tagname", ["AND" => ["opid" => $opid, $field => $id]]);
$tagshtml = "";
if (!empty($tags)) {
foreach ($tags as $t) {
# code...
$tagshtml .= '<span class="badge badge-default">'.$t.'</span> ';
}
return $tagshtml;
} else {
return "";
}
}
// Insert response time into the table
function insertResponsetime($opidcc, $opid, $ticketid, $responsetime, $firstcontact) {
global $jakdb;
$jakdb->insert("support_tickets_response", ["opid" => $opid, "ticketid" => $ticketid, "operatorid" => $opidcc, "responsetime" => $responsetime, "newticket" => $firstcontact, "created" => $jakdb->raw("NOW()")]);
return true;
}
// Set support live status
function set_support_ticket_live_status($opid, $ticketid, $userid, $clientid, $istyping) {
global $jakdb;
if (isset($ticketid) && isset($userid) && !empty($userid)) {
if ($jakdb->has("ticket_live_user", ["AND" => ["opid" => $opid, "ticketid" => $ticketid, "userid" => $userid]])) {
$jakdb->update("ticket_live_user", ["lastvisit" => time(), "istyping" => $istyping], ["AND" => ["ticketid" => $ticketid, "userid" => $userid]]);
} else {
$jakdb->insert("ticket_live_user", ["opid" => $opid, "ticketid" => $ticketid, "userid" => $userid, "initiated" => time(), "lastvisit" => time(), "istyping" => $istyping]);
}
} elseif (isset($ticketid) && isset($clientid) && !empty($clientid)) {
# code...
if ($jakdb->has("ticket_live_user", ["AND" => ["opid" => $opid, "ticketid" => $ticketid, "clientid" => $clientid]])) {
$jakdb->update("ticket_live_user", ["lastvisit" => time(), "istyping" => $istyping], ["AND" => ["ticketid" => $ticketid, "clientid" => $clientid]]);
} else {
$jakdb->insert("ticket_live_user", ["opid" => $opid, "ticketid" => $ticketid, "clientid" => $clientid, "initiated" => time(), "lastvisit" => time(), "istyping" => $istyping]);
}
} else {
return false;
}
return true;
}
// Search for lang files in the admin folder, only choose .ini files.
function jak_get_lang_files($lang = "") {
// Get the language folder
$langdir = APP_PATH.'lang/';
if ($handle = opendir($langdir)) {
/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))) {
$showlang = substr($file, strrpos($file, '.'));
if ($file != '.' && $file != '..' && $showlang == '.php' && $lang != substr($file, 0, -4)) {
$getlang[] = substr($file, 0, -4);
}
}
return $getlang;
closedir($handle);
}
}
// Get files
function jak_get_files($directory, $exempt = array('.','..','.ds_store','.svn','js','css','img','_cache','index.html'), &$files = array()) {
if ($handle = opendir($directory)) {
$getFiles = array();
/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))) {
if (!in_array($file, $exempt)) {
$getFiles[] = $file;
}
}
if (!empty($getFiles)) return $getFiles;
closedir($handle);
}
}
// Get custom files
function jak_get_custom_files($directory, $opcacheid, $exempt = array('.','..','.ds_store','.svn','js','css','img','_cache','index.html'), &$files = array()) {
if ($handle = opendir($directory)) {
$getFiles = array();
/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))) {
if (!in_array($file, $exempt)) {
$getFiles[] = $opcacheid.'/'.$file;
}
}
if (!empty($getFiles)) return $getFiles;
closedir($handle);
}
}
// Get files encrypted
function jak_get_files_encrypt($directory, $exempt = array('.','..','.ds_store','.svn','js','css','img','_cache','index.html'), &$files = array()) {
if ($handle = opendir($directory)) {
$getFiles = array();
/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))) {
if (!in_array($file, $exempt)) {
// Get the extension
$fext = pathinfo($file);
$mime_type = jak_mime_content_type($file, $fext['extension']);
// Now put all the files a array
$getFiles[] = array("encrypt" => str_replace(CLIENT_UPLOAD_DIR, "", $directory).'/'.$file.':#:'.$file.':#:'.$mime_type, "name" => $file, "path" => $directory.'/'.$file);
}
}
if (!empty($getFiles)) return $getFiles;
closedir($handle);
}
}
// Get files encrypted
function jak_single_file_encrypt($path, $filename, $clientid, $ticketid) {
if (file_exists($path.'/'.$filename)) {
// Get the extension
$fext = pathinfo($path.'/'.$filename);
$mime_type = jak_mime_content_type($path.'/'.$filename, $fext['extension']);
// Now put all the files a array
$returnFile = str_replace(CLIENT_UPLOAD_DIR, "", $path).'/'.$filename.':#:'.$filename.':#:'.$mime_type;
if (!empty($returnFile)) return jak_encrypt_decrypt($returnFile);
} else {
return false;
}
}
// Get file size
function human_filesize($filepath, $decimals = 2) {
$bytes = filesize($filepath);
$sz = 'BKMGTP';
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor].'B';
}
// Verify paramaters
function verifyparam($name, $regexp, $default = null) {
if (isset($_GET[$name])) {
$val = $_GET[$name];
if (preg_match($regexp, $val))
return $val;
} else if (isset($_POST[$name])) {
$val = $_POST[$name];
if (preg_match($regexp, $val))
return $val;
} else {
if (isset($default))
return $default;
}
die("<html><head></head><body>Wrong parameter used or absent: " . $name . "</body></html>");
}
function jak_calc_indiv_price($price, $custom) {
if ($custom != 0) {
$cpriceb = $price / 100 * $custom;
$cprice = round($cpriceb, 1);
$price += $cprice;
}
return number_format($price, 2, '.', '');
}
// create session id
function create_session_id($opcacheid, $depid, $opid, $ipa) {
global $jakdb;
// Get the referrer URL
$referrer = selfURL(NULL);
if (isset($_SESSION['rlbid']) && !empty($_SESSION['rlbid'])) {
$jakdb->update("buttonstats", ["depid" => $depid, "opid" => $opcacheid, "singleopid" => $opid, "hits[+]" => 1, "referrer" => $referrer, "ip" => $ipa, "lasttime" => $jakdb->raw("NOW()")], ["session" => $_SESSION['rlbid']]);
$rlbid = $_SESSION['rlbid'];
} else {
$salt = rand(100, 99999);
$rlbid = $salt.time();
// Get the client browser
$ua = new Browser();
// get client information
$clientsystem = $ua->getPlatform().' - '.$ua->getBrowser(). " " . $ua->getVersion();
// Country Stuff
$country_name = 'Disabled';
$country_code = 'xx';
$city = 'Disabled';
$country_lng = $country_lat = '';
// Now let's check if the ip is ipv4
if ($ipa && !$ua->isRobot()) {
$ipc = curl_init();
curl_setopt($ipc, CURLOPT_URL, "https://ipgeo.jakweb.ch/api/".$ipa);
curl_setopt($ipc, CURLOPT_HEADER, false);
curl_setopt($ipc, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ipc);
curl_close($ipc);
$getinfo = json_decode($response, true);
if (isset($getinfo) && !empty($getinfo)) {
$country_name = ucwords(strtolower(filter_var($getinfo["country"]["name"], FILTER_SANITIZE_FULL_SPECIAL_CHARS)));
$country_code = strtolower(filter_var($getinfo["country"]["code"], FILTER_SANITIZE_FULL_SPECIAL_CHARS));
$city = filter_var($getinfo["city"], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$country_lng = filter_var($getinfo["location"]["longitude"], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$country_lat = filter_var($getinfo["location"]["latitude"], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
// Setting a cookie with the data, which is set to expire in a week:
$geodata = jak_string_encrypt_decrypt($city.'|'.$country_name.'|'.$country_code.'|'.$country_lat.'|'.$country_lng.'|'.time());
}
}
$jakdb->insert("buttonstats", ["depid" => $depid, "opid" => $opcacheid, "singleopid" => $opid, "referrer" => $referrer, "firstreferrer" => $referrer, "agent" => $clientsystem, "hits" => 1, "ip" => $ipa, "country" => $country_name, "countrycode" => $country_code, "latitude" => $country_lat, "longitude" => $country_lng, "session" => $rlbid, "time" => $jakdb->raw("NOW()"), "lasttime" => $jakdb->raw("NOW()")]);
// Set the session because we can use it
$_SESSION['rlbid'] = $rlbid;
}
return $rlbid;
}
// Verfiy if there is a online operator
function online_operators($opid, $dp, $did = 0, $oid = 0) {
$timeout = time() - 300;
$timerunout = 1;
$department = 0;
$departmentall = array();
$departments = array();
$departmentp = array();
$dbfiltered = array();
global $jakdb;
// Check if the client is logged in
if (!JAK_CLIENTID) {
if (isset($dp) && !empty($dp)) foreach ($dp as $d) {
if ($d["guesta"] == 1) {
$dbfiltered[] = $d;
}
}
} else {
$dbfiltered = $dp;
}
// Update database first to see who is online!
$jakdb->update("user", ["available" => 0], ["AND" => ["OR" => ["id" => $opid, "opid" => $opid], "lastactivity[<]" => $timeout]]);
// Set to zero
$sql_where = '';
// We do have a department id
if ($did > 0) {
$sql_where = ' AND (chat_dep = 0 OR FIND_IN_SET(:did, chat_dep))';
}
// We do have an operator id
if ($oid > 0) {
$sql_where = ' AND id = :oid';
}
$sth = $jakdb->pdo->prepare("SELECT id, hours_array, phonenumber, available, chat_dep, emailnot, pusho_tok, push_notifications, alwaysonline FROM ".JAKDB_PREFIX."user WHERE (id = :opid OR opid = :opid) AND access = 1".$sql_where);
if ($opid > 0) $sth->bindParam(':opid', $opid, PDO::PARAM_INT);
if ($oid > 0) $sth->bindParam(':oid', $oid, PDO::PARAM_INT);
if ($did > 0 && $oid == 0) $sth->bindParam(':did', $did, PDO::PARAM_INT);
$sth->execute();
$result = $sth->fetchAll();
if (isset($result) && !empty($result)) {
foreach ($result as $row) {
// At this point no operator is online
$oponline = false;
// Operator is available
if ($row["available"] == 1 || $row["alwaysonline"] == 1) $oponline = true;
// Now let's check if we have a time available
if (!$oponline && JAK_base::jakAvailableHours($row["hours_array"], date('Y-m-d H:i:s')) && ($row["phonenumber"] || $row["emailnot"] || JAK_NATIVE_APP_TOKEN || $row["pusho_tok"] || $row["push_notifications"])) $oponline = true;
// Now we have an available operator
if ($oponline) {
// Departments is 0 we use all.
if ($row["chat_dep"] == 0) {
$departmentall = $dbfiltered;
}
// Single department we use the one
if (is_numeric($row["chat_dep"])) {
if (isset($dbfiltered) && is_array($dbfiltered)) foreach($dbfiltered as $z) {
if ($z["id"] == $row["chat_dep"]) {
$departments[] = $z;
}
}
}
// Department array, let's get the right ones.
if ($row["chat_dep"] != 0 && !is_numeric($row["chat_dep"])) {
if (isset($dbfiltered) && is_array($dbfiltered)) foreach($dbfiltered as $z) {
if (in_array($z["id"], explode(',', $row["chat_dep"]))) {
$departmentp[] = $z;
}
}
}
}
}
} else {
$timerunout = 0;
}
if ($timerunout && is_array($departmentall)) {
$department = array_merge($departmentp, $departmentall, $departments);
if (is_array($department)) $department = array_map("unserialize", array_unique(array_map("serialize", $department)));
return $department;
} else {
return false;
}
}
// Verfiy if there is a online operator with whatsapp
function online_operator_list_whatsapp($opid, $dp, $did = 0, $oid = 0) {
$timeout = time() - 300;
$timerunout = 1;
$department = 0;
$opdetails = array();
global $jakdb;
// Check if the client is logged in
if (!JAK_CLIENTID) {
foreach ($dp as $d) {
if ($d["guesta"] == 1) {
$dbfiltered[] = $d;
}
}
} else {
$dbfiltered = $dp;
}
// Update database first to see who is online!
$jakdb->update("user", ["available" => 0], ["AND" => ["OR" => ["id" => $opid, "opid" => $opid], "lastactivity[<]" => $timeout]]);
// Set to zero
$sql_where = '';
// We do have a department id
if ($did > 0) {
$sql_where = ' AND (chat_dep = 0 OR FIND_IN_SET(:did, chat_dep))';
}
// We do have an operator id
if ($oid > 0) {
$sql_where = ' AND id = :oid';
}
$sth = $jakdb->pdo->prepare("SELECT id, chat_dep, name, picture, aboutme, hours_array, whatsappnumber, available, alwaysnot, alwaysonline FROM ".JAKDB_PREFIX."user WHERE (id = :opid OR opid = :opid) AND access = 1 AND whatsappnumber != ''".$sql_where." ORDER BY chat_dep ASC");
if ($opid > 0) $sth->bindParam(':opid', $opid, PDO::PARAM_INT);
if ($oid > 0)$sth->bindParam(':oid', $oid, PDO::PARAM_INT);
if ($did > 0 && $oid == 0) $sth->bindParam(':did', $did, PDO::PARAM_INT);
$sth->execute();
$result = $sth->fetchAll();
if (isset($result) && !empty($result)) {
foreach ($result as $row) {
$oponline = false;
// Operator is available
if ($row["available"] == 1 || $row["alwaysnot"] == 1 || $row["alwaysonline"] == 1) $oponline = true;
// Now let's check if we have a time available
if (!$oponline && JAK_base::jakAvailableHours($row["hours_array"], date('Y-m-d H:i:s')) && ($row["whatsappnumber"])) $oponline = true;
// Departments is 0 we use all.
$deptitle = array();
if (is_numeric($row["chat_dep"])) {
if (isset($dbfiltered) && is_array($dbfiltered)) foreach($dbfiltered as $z) {
if ($z["id"] == $row["chat_dep"]) {
$deptitle[] = $z["title"];
}
}
// Department array, let's get the right ones.
} elseif ($row["chat_dep"] != 0 && !is_numeric($row["chat_dep"])) {
$deptitle = array();
if (isset($dbfiltered) && is_array($dbfiltered)) foreach($dbfiltered as $z) {
if (in_array($z["id"], explode(',', $row["chat_dep"]))) {
$deptitle[] = $z["title"];
}
}
}
$deptitle = join(', ', $deptitle);
$opdetails[] = array("id" => $row["id"], "name" => $row["name"], "picture" => $row["picture"], "aboutme" => $row["aboutme"], "whatsappnumber" => $row["whatsappnumber"], "title" => $deptitle, "isonline" => $oponline);
}
} else {
$timerunout = 0;
}
if ($timerunout) {
return $opdetails;
} else {
return false;
}
}
function online_operator_list($opid, $dp, $did = 0, $oid = 0) {
$timeout = time() - 300;
$timerunout = 1;
$department = 0;
$opdetails = array();
global $jakdb;
// Check if the client is logged in
$dbfiltered = $dp;
// Update database first to see who is online!
$jakdb->update("user", ["available" => 0], ["AND" => ["OR" => ["id" => $opid, "opid" => $opid], "lastactivity[<]" => $timeout]]);
// Set to zero
$sql_where = '';
// We do have a department id
if ($did > 0) {
$sql_where = ' AND (departments = 0 OR FIND_IN_SET(:did, departments))';
}
// We do have an operator id
if ($oid > 0) {
$sql_where = ' AND id = :oid';
}
$sth = $jakdb->pdo->prepare("SELECT id, name, picture, hours_array, aboutme, phonenumber, available, departments, emailnot, pusho_tok, push_notifications, alwaysonline FROM ".JAKDB_PREFIX."user WHERE (id = :opid OR opid = :opid) AND access = 1".$sql_where." ORDER BY departments ASC");
if ($opid > 0) $sth->bindParam(':opid', $opid, PDO::PARAM_INT);
if ($oid > 0)$sth->bindParam(':oid', $oid, PDO::PARAM_INT);
if ($did > 0 && $oid == 0) $sth->bindParam(':did', $did, PDO::PARAM_INT);
$sth->execute();
$result = $sth->fetchAll();
if (isset($result) && !empty($result)) {
foreach ($result as $row) {
$oponline = false;
// Operator is available
if ($row["available"] == 1 || $row["alwaysonline"] == 1) $oponline = true;
// Now let's check if we have a time available
if (!$oponline && JAK_base::jakAvailableHours($row["hours_array"], date('Y-m-d H:i:s')) && ($row["phonenumber"] || $row["emailnot"] || JAK_NATIVE_APP_TOKEN || $row["pusho_tok"] || $row["push_notifications"])) $oponline = true;
// Now we have an available operator
if ($oponline) {
// Get the user stats
$ustat = $jakdb->count("user_stats", "id", ["AND" => ["userid" => $row["id"], "vote[>]" => 2]]);
// Departments is 0 we use all.
$deptitle = "";
if (is_numeric($row["departments"])) {
if (isset($dbfiltered) && is_array($dbfiltered)) foreach($dbfiltered as $z) {
if ($z["id"] == $row["departments"]) {
$deptitle = $z["title"];
}
}
// Department array, let's get the right ones.
} elseif ($row["departments"] != 0 && !is_numeric($row["departments"])) {
if (isset($dbfiltered) && is_array($dbfiltered)) foreach($dbfiltered as $z) {
if (in_array($z["id"], explode(',', $row["departments"]))) {
$deptitle = $z["title"];
}
}
}
$opdetails[] = array("id" => $row["id"], "name" => $row["name"], "picture" => $row["picture"], "aboutme" => $row["aboutme"], "sum" => $ustat, "title" => $deptitle);
}
}
} else {
$timerunout = 0;
}
if ($timerunout) {
return $opdetails;
} else {
return false;
}
}
// Get a clean and secure post from user
function jak_clean_safe_userpost($input) {
// Trim
$input = trim($input);
// We remove empty paragraphs
$input = preg_replace('/<p[^>]*>(?:\s|&nbsp;| )*<\/p>/', '', $input);
// keep going and remove dirty code
include_once 'htmlawed.php';
$allowedhtml = array('safe' => 1, 'elements'=>'div, em, p, br, img, ul, li, i, ol, a, strong, pre, code, div, address, abbr, hr, h1, h2, h3, h4, h5, h6, iframe, video, source, table, tbody, td, tfoot, th, thead, tr, font, span', 'comment'=> 1, 'cdata' => 1, 'valid_xhtml' => 1, 'make_tag_strict' => 1);
$input = htmLawed($input, $allowedhtml);
$input = trim($input);
// Now return the input
return $input;
}
// Check if the lang folder for buttons exist
function folder_lang_button($lang) {
return file_exists('./img/buttons/'.$lang.'/');
}
// Get the real IP Address
function get_ip_address() {
foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
if (array_key_exists($key, $_SERVER) === true) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
return $ip;
} elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
return $ip;
} else {
return 0;
}
}
}
}
}
// Send Emails via PHP MAILER
function jak_send_email($mailaddress, $mailccaddress, $replyto, $subject, $message, $emailfiles) {
// Now let's start with sending emails
$mail = new PHPMailer(true);
// SMTP
if (JAK_SMTP_MAIL == 1) {
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = JAK_SMTPHOST;
$mail->SMTPAuth = (JAK_SMTP_AUTH ? true : false); // enable SMTP authentication
$mail->SMTPSecure = JAK_SMTP_PREFIX; // sets the prefix to the server
$mail->SMTPAutoTLS = false;
$mail->SMTPKeepAlive = (JAK_SMTP_ALIVE ? true : false); // SMTP connection will not close after each email sent
$mail->Port = JAK_SMTPPORT; // set the SMTP port for the GMAIL server
$mail->Username = JAK_SMTPUSERNAME; // SMTP account username
$mail->Password = JAK_SMTPPASSWORD; // SMTP account password
// OAuth2
} elseif (JAK_SMTP_MAIL == 2) {
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Set AuthType to use XOAUTH2
$mail->AuthType = 'XOAUTH2';
$oauth_params = [
'clientId' => JAK_OAUTH_CLIENTID,
'clientSecret' => JAK_OAUTH_SECRET,
];
switch (JAK_OAUTH_PROVIDER) {
case 'Google':
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$provider = new Google($oauth_params);
break;
case 'Yahoo':
$mail->Host = 'smtp.mail.yahoo.com';
$mail->Port = 465;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$provider = new Yahoo($oauth_params);
break;
case 'Microsoft':
$mail->Host = 'smtp.office365.com';
$mail->Port = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$provider = new Microsoft($oauth_params);
break;
case 'Azure':
$mail->Host = 'smtp.office365.com';
$mail->Port = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$params['tenantId'] = JAK_OAUTH_TENANTID;
$provider = new Azure($oauth_params);
break;
}
if ($provider) {
$mail->setOAuth(
new OAuth(
[
'provider' => $provider,
'clientId' => JAK_OAUTH_CLIENTID,
'clientSecret' => JAK_OAUTH_SECRET,
'refreshToken' => JAK_OAUTH_REFRESH,
'userName' => JAK_SMTP_SENDER,
]
)
);
}
}
// Finally send the email
$mail->SetFrom(JAK_SMTP_SENDER);
// Email Adressess
if (isset($mailaddress) && !empty($mailaddress)) {
if (is_array($mailaddress)) {
foreach ($mailaddress as $k => $ea) {
if (!empty($ea)) {
$mail->addAddress($ea);
}
}
} else {
$mail->addAddress($mailaddress);
}
}
// CC Adressess
if (isset($mailccaddress) && !empty($mailccaddress)) {
if (is_array($mailccaddress)) {
foreach ($mailccaddress as $k => $occ) {
if (!empty($occ)) {
$mail->addCC($occ);
}
}
} else {
$mail->addCC($mailccaddress);
}
}
// Reply To
if (isset($replyto) && !empty($replyto)) $mail->AddReplyTo($replyto);
// We have attachments
if (isset($emailfiles) && !empty($emailfiles)) {
if (is_array($emailfiles)) {
foreach ($emailfiles as $k => $ef) {
if (!empty($ef)) {
$mail->addAttachment($ef);
}
}
} else {
$mail->addAttachment($emailfiles);
}
}
$mail->CharSet = 'UTF-8';
$mail->Subject = $subject;
$mail->MsgHTML($message);
$mail->AltBody = strip_tags($message);
// Send
if ($mail->Send()) {
//Clear all addresses and attachments for the next iteration
$mail->clearAddresses();
$mail->clearAttachments();
return true;
} else {
return false;
}
}
// Send Notifications
function jak_send_notifications($userid, $convid, $title, $msg, $url, $pushnot, $emailnot, $email, $pushotok, $pushokey, $phonenr) {
$op_phones = array();
$msg = stripcslashes($msg);
// Native App notification
if ($pushnot && JAK_NATIVE_APP_TOKEN && JAK_NATIVE_APP_KEY) {
global $jakdb;
// Do we have a valid device for this user
$vd = false;
$vd = $jakdb->select("push_notification_devices", ["ostype", "token", "appname"], ["userid" => $userid]);
if (isset($vd) && !empty($vd)) foreach ($vd as $vdrow) {
$fields = array("token" => JAK_NATIVE_APP_TOKEN, "user" => JAK_NATIVE_APP_KEY, "ostype" => $vdrow["ostype"], "device" => $vdrow["token"], "appname" => $vdrow["appname"], "title" => JAK_TITLE, "message" => $msg);
$str = http_build_query($fields);
$jm = curl_init();
curl_setopt($jm, CURLOPT_URL, "https://jakweb.ch/push/m");
curl_setopt($jm, CURLOPT_HEADER, false);
curl_setopt($jm, CURLOPT_RETURNTRANSFER, true);
curl_setopt($jm, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($jm, CURLOPT_POST, count($fields));
curl_setopt($jm, CURLOPT_POSTFIELDS, $str);
$response = curl_exec($jm);
curl_close($jm);
}
}
// Email Notifications
if ($emailnot) {
// Ok, we send the email // email address, cc email address, reply to, subject, message, attachment
jak_send_email($email, "", "", JAK_TITLE, '<a href="'.$url.'">'.$msg.'</a>', "");
}
// Pushover
if ($pushnot && $pushotok && $pushokey) {
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://api.pushover.net/1/messages.json");
curl_setopt($c, CURLOPT_HEADER, false);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_POSTFIELDS, array(
"token" => $pushotok,
"user" => $pushokey,
"message" => $msg,
"title" => JAK_TITLE,
"url" => $url
));
$response = curl_exec($c);
curl_close($c);
}
if (JAK_TW_SID && JAK_TW_TOKEN && $phonenr) {
// Twilio
if (JAK_TWILIO_NEXMO == 1) {
$twurl = "https://api.twilio.com/2010-04-01/Accounts/".JAK_TW_SID."/Messages.json";
$data = array (
'From' => JAK_TW_PHONE,
'To' => $phonenr,
'Body' => $msg,
);
$post = http_build_query($data);
$tw = curl_init($twurl);
curl_setopt($tw, CURLOPT_POST, true);
curl_setopt($tw, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($tw, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($tw, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($tw, CURLOPT_USERPWD, JAK_TW_SID.':'.JAK_TW_TOKEN);
curl_setopt($tw, CURLOPT_POSTFIELDS, $post);
$twresponse = curl_exec($tw);
curl_close($tw);
// Plivo
} elseif (JAK_TWILIO_NEXMO == 2) {
$op_phones[] = $phonenr;
// Nexmo
} else {
require_once(APP_PATH.'include/nexmo/NexmoMessage.php');
// Step 1: Declare new NexmoMessage. (Api Key) (Api Secret)
$nexmo_sms = new NexmoMessage(JAK_TW_SID, JAK_TW_TOKEN);
// Step 2: Use sendText( $to, $from, $message ) method to send a message.
$info = $nexmo_sms->sendText($phonenr, JAK_TITLE, $msg);
}
}
// Send the sms with plivo
if (isset($op_phones) && !empty($op_phones)) {
// Join the number to a list
$sendsmsop = join(',', $op_phones);
# SMS sender ID.
$src = (JAK_TW_PHONE ? JAK_TW_PHONE : JAK_TITLE);
# SMS destination number
$dst = $sendsmsop;
# SMS text
$text = $msg;
$url = 'https://api.plivo.com/v1/Account/'.JAK_TW_SID.'/Message/';
$data = array("src" => "$src", "dst" => "$dst", "text" => "$text");
$data_string = json_encode($data);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_USERPWD, JAK_TW_SID . ":" . JAK_TW_TOKEN);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$curl_output = curl_exec($ch);
curl_close($ch);
}
return true;
}
// Replace urls
function replace_urls($string) {
$string = preg_replace('/(https?|ftp)([\:\/\/])([^\\s]+)/', '<a href="$1$2$3" target="_blank">$1$2$3</a>', $string);
return $string;
}
// only full words
function jak_cut_text($jakvar,$jakvar1,$jakvar2) {
if (empty($jakvar1)) {
$jakvar1 = 160;
}
$crepl = array('<?','<?php','"',"'","?>");
$cfin = array('','','','','');
$jakvar = str_replace($crepl, $cfin, $jakvar);
$jakvar = trim($jakvar);
$jakvar = strip_tags($jakvar);
$txtl = strlen($jakvar);
if($txtl > $jakvar1) {
for($i=1;$jakvar[$jakvar1-$i]!=" ";$i++) {
if($i == $jakvar1) {
return substr($jakvar,0,$jakvar1).$jakvar2;
}
}
$jakdata = substr($jakvar,0,$jakvar1-$i+1).$jakvar2;
} else {
$jakdata = $jakvar;
}
return $jakdata;
}
// Detect Mobile Browser in a simple way to display videos in html5 or video/template not available message
function jak_find_browser($useragent, $wap) {
$ifmobile = preg_match('/android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile|o2|opera m(ob|in)i|palm( os)?|p(ixi|re)\/|plucker|pocket|psp|smartphone|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce; (iemobile|ppc)|xiino/i', $useragent);
$ifmobileM = preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i', substr($useragent,0,4));
if ($ifmobile || $ifmobileM || isset($wap)) {
return true;
} else {
return false;
}
}
function selfURL($url) {
if (isset($url) && !empty($url)) {
$referrer = $url;
} else {
$referrer = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
}
$referrer = filter_var($referrer, FILTER_VALIDATE_URL);
return $referrer;
}
// Password generator
function jak_password_creator($length = 8) {
return substr(md5(rand().rand()), 0, $length);
}
function jak_write_vote_hits_cookie($table, $id, $cookie) {
if (isset($_COOKIE[$cookie])) {
$cookiearray = explode(',', $_COOKIE[$cookie]);
if (in_array($table.'-'.$id, $cookiearray)) {
$getCORE = $_COOKIE[$cookie];
} else {
$getCORE = $_COOKIE[$cookie].','.$table.'-'.$id;
}
} else {
$getCORE = $table.'-'.$id;
}
return JAK_base::jakCookie($cookie, $getCORE, 86400, JAK_COOKIE_PATH);
}
function jak_cookie_voted_hits($table, $id, $cookie) {
if (isset($_COOKIE[$cookie])) {
$cookiearray = explode(',', $_COOKIE[$cookie]);
if (in_array($table.'-'.$id, $cookiearray)) {
return true;
} else {
return false;
}
} else {
return false;
}
}
// Get the html chat widget content
function jak_html_widget_css($chatposition) {
// Reset some vars
$iframestyle = "";
if ($chatposition) {
$iframestyle = 'position:fixed;'.$chatposition;
}
$iframestyle .= 'z-index:9999;';
return $iframestyle;
}
// Get the custom fields ready to serve
function jak_get_custom_fields($location, $opid, $depid, $clientid, $ticketid, $contactid, $lang, $readonly, $admin, $table, $registerform, $errors = NULL) {
global $jakdb;
$fields = $translations = '';
// Get the correct fields
if ($location == 1) {
if ($registerform) {
$formfields = $jakdb->select('customfields', "*", ["AND" => ["opid" => $opid, "fieldlocation" => 1, "onregister" => 1], "ORDER" => ["dorder" => "ASC"]]);
} else {
$formfields = $jakdb->select('customfields', "*", ["opid" => $opid, "fieldlocation" => 1, "ORDER" => ["dorder" => "ASC"]]);
}
} else if ($location == 3) {
$formfields = $jakdb->select('customfields', "*", ["opid" => $opid, "fieldlocation" => 3, "ORDER" => ["dorder" => "ASC"]]);
} else {
if ($depid != 0) {
$depid = [0, $depid];
}
$formfields = $jakdb->select('customfields', "*", ["AND" => ["opid" => $opid, "fieldlocation" => 2, "depid" => $depid], "ORDER" => ["dorder" => "ASC"]]);
}
// Get the correct language
if (isset($lang) && !empty($lang) && $lang != JAK_LANG) {
$translations = $jakdb->select('translations', ["customfieldid", "title", "description"], ["AND" => ["opid" => $opid, "lang" => $lang, "customfieldid[!]" => 0]]);
}
// Get all the values from this customer
if (isset($clientid) && is_numeric($clientid) && isset($ticketid) && is_numeric($ticketid)) {
$cvalue = $jakdb->select("customfields_data", ["val_slug", "set_value"], ["AND" => ["opid" => $opid, "clientid" => $clientid, "ticketid" => $ticketid, "fieldlocation" => $location]]);
} elseif (isset($contactid) && is_numeric($contactid)) {
$cvalue = $jakdb->select("customfields_data", ["val_slug", "set_value"], ["AND" => ["opid" => $opid, "contactid" => $contactid, "fieldlocation" => $location]]);
} elseif (isset($clientid) && is_numeric($clientid)) {
$cvalue = $jakdb->select("customfields_data", ["val_slug", "set_value"], ["AND" => ["opid" => $opid, "clientid" => $clientid, "fieldlocation" => $location]]);
}
// Empty
$fields = "";
if (isset($formfields) && !empty($formfields)) {
foreach ($formfields as $v) {
if ($v["fieldtype"] == 2 || $v["fieldtype"] == 3 || $v["fieldtype"] == 4) {
$fieldoptions = explode(",", $v["field_html"]);
// Set translation to false because it does not exist
$tl = false;
}
// Get the translation
if (isset($translations) && !empty($translations)) foreach ($translations as $t) {
if ($t["customfieldid"] == $v["id"]) {
$v["title"] = $t["title"];
if ($v["fieldtype"] == 2 || $v["fieldtype"] == 3 || $v["fieldtype"] == 4) {
$fieldoptionstrans = explode(",", $t["description"]);
$fieldoptions = array_combine($fieldoptions, $fieldoptionstrans);
// Set translation to true because it does exist
$tl = true;
}
}
}
// Now we get the correct value
$set_data = "";
if (isset($cvalue) && !empty($cvalue)) foreach($cvalue as $cv) {
if ($cv["val_slug"] == $v["val_slug"]) {
$set_data = $cv["set_value"];
break;
}
}
if ($admin) {
if ($v["fieldtype"] == 1) {
// INPUT
$fields .= '<div class="form-group">
<label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label>
<input type="text" name="'.$v["val_slug"].'" id="'.$v["val_slug"].'" class="form-control'.(isset($errors[$v["val_slug"]]) && $errors[$v["val_slug"]] ? ' is-invalid' : '').'" value="'.(isset($set_data) ? $set_data : '').'"'.($readonly ? ' readonly' : '').'></div>';
} elseif ($v["fieldtype"] == 2) {
// RADIO
$fields .= '<div class="form-group"><label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label>';
if (isset($fieldoptions) && !empty($fieldoptions)) foreach ($fieldoptions as $k => $z) {
$value = ($tl ? $k : $z);
$fields .= '<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="'.$v["val_slug"].'" value="'.$value.'"'.(isset($set_data) && $set_data == $value ? ' checked' : '').''.($readonly ? ' readonly' : '').'> '.$z.'
<span class="circle">
<span class="check"></span>
</span>
</label>
</div>';
}
$fields .= '</div>';
} elseif ($v["fieldtype"] == 3) {
// CHECKBOX
$fields .= '<div class="form-group"><label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label>';
if (isset($fieldoptions) && !empty($fieldoptions)) foreach ($fieldoptions as $k => $z) {
$value = ($tl ? $k : $z);
$fields .= '<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" name="'.$v["val_slug"].'[]" value="'.$value.'"'.(isset($set_data) && in_array($value, explode(',', $set_data)) ? ' checked' : '').''.($readonly ? ' readonly' : '').'> '.$z.'
<span class="form-check-sign">
<span class="check"></span>
</span>
</label>
</div>';
}
$fields .= '</div>';
} elseif ($v["fieldtype"] == 4) {
// SELECT
$fields .= '<div class="form-group"><label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label><select name="'.$v["val_slug"].'" class="selectpicker col-12" data-live-search="true">';
if (isset($fieldoptions) && !empty($fieldoptions)) foreach ($fieldoptions as $k => $z) {
$value = ($tl ? $k : $z);
$fields .= '<option value="'.$value.'"'.(isset($set_data) && $set_data == $value ? ' selected' : '').''.($readonly ? ' readonly' : '').'>'.$z.'</option>';
}
$fields .= '</select></div>';
} elseif ($v["fieldtype"] == 5) {
// TEXTAREA
$fields .= '<div class="form-group">
<label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label>
<textarea class="form-control'.(isset($errors[$v["val_slug"]]) && $errors[$v["val_slug"]] ? ' is-invalid' : '').'" name="'.$v["val_slug"].'"'.($readonly ? ' readonly' : '').'>'.(isset($set_data) ? $set_data : '').'</textarea></div>';
}
} else {
if ($v["fieldtype"] == 1) {
// INPUT
$fields .= '<div class="form-group'.(isset($errors[$v["val_slug"]]) && $errors[$v["val_slug"]] ? ' has-danger' : '').'">
<label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label>
<input type="text" name="'.$v["val_slug"].'" id="'.$v["val_slug"].'" class="form-control'.(isset($errors[$v["val_slug"]]) && $errors[$v["val_slug"]] ? ' is-invalid' : '').'" value="'.(isset($set_data) ? $set_data : '').'"'.($readonly ? ' readonly' : '').'></div>';
} elseif ($v["fieldtype"] == 2) {
// RADIO
$fields .= '<div class="form-group"><label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label>';
if (isset($fieldoptions) && !empty($fieldoptions)) foreach ($fieldoptions as $k => $z) {
$value = ($tl ? $k : $z);
$fields .= '<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="'.$v["val_slug"].'" value="'.$value.'"'.(isset($set_data) && $set_data == $value ? ' checked' : '').''.($readonly ? ' readonly' : '').'> '.$z.'
<span class="circle">
<span class="check"></span>
</span>
</label>
</div>';
}
$fields .= '</div>';
} elseif ($v["fieldtype"] == 3) {
// CHECKBOX
$fields .= '<div class="form-group"><label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label>';
if (isset($fieldoptions) && !empty($fieldoptions)) foreach ($fieldoptions as $k => $z) {
$value = ($tl ? $k : $z);
$fields .= '<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" name="'.$v["val_slug"].'[]" value="'.$value.'"'.(isset($set_data) && in_array($value, explode(',', $set_data)) ? ' checked' : '').''.($readonly ? ' readonly' : '').'> '.$z.'
<span class="form-check-sign">
<span class="check"></span>
</span>
</label>
</div>';
}
$fields .= '</div>';
} elseif ($v["fieldtype"] == 4) {
// SELECT
$fields .= '<div class="form-group"><label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label><select name="'.$v["val_slug"].'" class="form-control">';
if (isset($fieldoptions) && !empty($fieldoptions)) foreach ($fieldoptions as $k => $z) {
$value = ($tl ? $k : $z);
$fields .= '<option value="'.$value.'"'.(isset($set_data) && $set_data == $value ? ' selected' : '').''.($readonly ? ' readonly' : '').'>'.$z.'</option>';
}
$fields .= '</select></div>';
} elseif ($v["fieldtype"] == 5) {
// TEXTAREA
$fields .= '<div class="form-group'.(isset($errors[$v["val_slug"]]) && $errors[$v["val_slug"]] ? ' has-danger' : '').'">
<label class="control-label" for="'.$v["val_slug"].'">'.$v["title"].'</label>
<textarea class="form-control" name="'.$v["val_slug"].'"'.($readonly ? ' readonly' : '').'>'.(isset($set_data) ? $set_data : '').'</textarea></div>';
}
}
}
}
return $fields;
}
function jak_save_custom_fields($opid, $clientid, $ticketid, $contactid, $jkp, $fieldloc) {
global $jakdb;
// And we complete the custom fields
$formfields = $jakdb->select('customfields', "val_slug", ["AND" => ["opid" => $opid, "fieldlocation" => $fieldloc]]);
if (isset($formfields) && !empty($formfields)) {
foreach ($formfields as $v) {
if (isset($jkp[$v]) && is_array($jkp[$v])) {
$joinval = join(',', $jkp[$v]);
if ($jakdb->has('customfields_data', ["AND" => ["val_slug" => $v, "opid" => $opid, "clientid" => $clientid, "ticketid" => $ticketid, "contactid" => $contactid, "fieldlocation" => $fieldloc]])) {
$jakdb->update('customfields_data', ["set_value" => $joinval], ["AND" => ["val_slug" => $v, "opid" => $opid, "clientid" => $clientid, "ticketid" => $ticketid, "contactid" => $contactid, "fieldlocation" => $fieldloc]]);
} else {
$jakdb->insert('customfields_data', ["val_slug" => $v, "opid" => $opid, "clientid" => $clientid, "ticketid" => $ticketid, "contactid" => $contactid, "fieldlocation" => $fieldloc, "set_value" => $joinval]);
}
} else {
if ($jakdb->has('customfields_data', ["AND" => ["val_slug" => $v, "opid" => $opcacheid, "clientid" => $clientid, "ticketid" => $ticketid, "contactid" => $contactid, "fieldlocation" => $fieldloc]])) {
$jakdb->update('customfields_data', ["set_value" => $jkp[$v]], ["AND" => ["val_slug" => $v, "opid" => $opid, "clientid" => $clientid, "ticketid" => $ticketid, "contactid" => $contactid, "fieldlocation" => $fieldloc]]);
} else {
$jakdb->insert('customfields_data', ["val_slug" => $v, "opid" => $opid, "clientid" => $clientid, "ticketid" => $ticketid, "contactid" => $contactid, "fieldlocation" => $fieldloc, "set_value" => $jkp[$v]]);
}
}
}
}
}
// Secure the site and display videos
function jak_secure_site($input)
{
$input = stripslashes($input);
$youtube = strpos($input, 'youtube.com');
$youtube2 = strpos($input, 'youtu.be');
$vimeo = strpos($input, 'vimeo.com');
// Check if there is a url in the text
if (!empty($youtube) || !empty($youtube2) || !empty($vimeo)) {
// The Regular Expression filter
$reg_exUrl = '/(http\:\/\/www\.youtube\.com\/watch\?v=\w{11})/';
$reg_exUrl2 = '(http://youtu.be/[-|~_0-9A-Za-z]+)';
$reg_exUrlv = '/(http\:\/\/(www\.vimeo|vimeo)\.com\/[0-9]{8})/';
preg_match($reg_exUrl, $input, $url);
if (isset($url[0])) {
$flurl = JAK_rewrite::jakVideourlparser($url[0], 'site');
// make the urls hyper links
$input = preg_replace($reg_exUrl, '<figure><iframe class="v_player" src="'.$flurl.'" frameborder="0"></iframe></figure><p class="clearfix"></p>', $input);
}
preg_match($reg_exUrl2, $input, $url2);
if (isset($url2[0])) {
$flurl2 = JAK_rewrite::jakVideourlparser($url2[0], 'site');
// make the urls hyper links
$input = preg_replace($reg_exUrl2, '<figure><iframe class="v_player" src="'.$flurl2.'" frameborder="0"></iframe></figure><p class="clearfix"></p>', $input);
}
preg_match($reg_exUrlv, $input, $vurl);
if (isset($vurl[0])) {
$flurlv = JAK_rewrite::jakVideourlparser($vurl[0], 'site');
// make the urls hyper links
$input = preg_replace($reg_exUrlv, '<figure><iframe class="v_player" src="'.$flurlv.'" frameborder="0"></iframe></figure><p class="clearfix"></p>', $input);
}
}
return $input;
}
// Get the mime type for the file upload
function jak_mime_content_type($filename, $ext) {
$mime_types = 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',
// images
'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',
// archives
'zip' => 'application/zip',
'rar' => 'application/x-rar-compressed',
'exe' => 'application/x-msdownload',
'msi' => 'application/x-msdownload',
'cab' => 'application/vnd.ms-cab-compressed',
// audio/video
'mp3' => 'audio/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
// adobe
'pdf' => 'application/pdf',
'psd' => 'image/vnd.adobe.photoshop',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
// ms office
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
// open office
'odt' => 'application/vnd.oasis.opendocument.text',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
);
if (array_key_exists($ext, $mime_types)) {
return $mime_types[$ext];
} elseif (function_exists('finfo_open')) {
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mimetype;
} else {
return false;
}
}
function jak_create_htaccess($path) {
if (!file_exists($path."/.htaccess")) {
try {
$file = fopen($path."/.htaccess","w");
$txt = "order deny,allow\n";
$txt .= "deny from all\n";
$txt .= "allow from 127.0.0.1";
fwrite($file, $txt);
fclose($file);
return true;
} catch (Exception $e) {
return false;
}
}
}
// External files
function jak_load_external_file($path, $orig_name, $mime_type) {
// Get the file
$thefile = str_replace('//','/', CLIENT_UPLOAD_DIR.'/'.$path);
if (!empty($path) && !empty($orig_name) && !empty($mime_type) && file_exists($thefile)) {
if (getimagesize($thefile)) {
/* Send headers and file to visitor for display */
header("Content-Type: " . $mime_type);
readfile($thefile);
} else {
/* Send headers and file to visitor for download */
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename='.basename($orig_name));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($thefile));
header("Content-Type: " . $mime_type);
readfile($thefile);
}
} else {
return false;
}
}
// Encrypt / Decrypt strings for file uploading
function jak_encrypt_decrypt($data, $ed = true) {
$output = false;
$encrypt_method = "AES-256-CBC";
$key = hash('sha256', JAK_FILE_SECRET_KEY);
$iv = substr(hash('sha256', JAK_FILE_SECRET_IV), 0, 16);
if ($ed) {
$output = base64_encode(openssl_encrypt($data, $encrypt_method, $key, 0, $iv));
} elseif (!$ed){
$output = openssl_decrypt(base64_decode($data), $encrypt_method, $key, 0, $iv);
}
return $output;
}
// Encrypt / Decrypt strings for file uploading
function jak_string_encrypt_decrypt($data, $ed = true) {
$output = false;
$encrypt_method = "AES-128-CTR";
$key = JAK_STRING_SECRET_KEY;
$iv = substr(hash('sha256', JAK_STRING_SECRET_IV), 0, 16);
if ($ed) {
$output = openssl_encrypt($data, $encrypt_method, $key, 0, $iv);
} elseif (!$ed){
$output = openssl_decrypt($data, $encrypt_method, $key, 0, $iv);
}
return $output;
}
// Base 64 URL safe
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '._-');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '._-', '+/='));
}
// Verify Envato Purchase code
function verify_envato_purchase_code($code_to_verify){
$code = $code_to_verify;
$personalToken = JAK_ENVATO_API_TOKEN;
$userAgent = "Purchase code verification";
// Build the request
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => "https://api.envato.com/v3/market/author/sale?code={$code}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => array(
"Authorization: Bearer {$personalToken}",
"User-Agent: {$userAgent}"
)
));
$output = json_decode(curl_exec($ch), true);
curl_close($ch);
return $output;
}
// We request some for the chat
function jak_chatgpt_chat($usermsg, $gptmsgs, $widgettopic, $widgetid, $lang, $depid) {
// We have previous messages
$conversation = [];
// Topic Message
if (!empty($widgettopic)) {
$conversation[] = [
"role" => "system",
"content" => $widgettopic
];
}
// ChatGPT History
if (!empty($gptmsgs)) foreach( $gptmsgs as $msg ) {
$conversation[] = [
"role" => "system",
"content" => $msg["message"]
];
}
// User Message
$conversation[] = [
"role" => "user",
"content" => $usermsg
];
// Convert conversation to JSON
$jsonData = json_encode(array(
"model" => "gpt-3.5-turbo",
"messages" => $conversation
));
// cURL initialization
$ch = curl_init();
// Set cURL options
curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/chat/completions');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"Authorization: Bearer ".JAK_OPENAI_APIKEY,
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
// Execute the cURL request
$response = curl_exec($ch);
// Close cURL connection
curl_close($ch);
// die(print_r($response."<br>". curl_error($ch)));
// Handle the response
if ($response === false) {
// Error handling
return false;
// echo 'cURL error: ' . curl_error($ch);
} else {
// Process the response
$botReply = "";
$responseData = json_decode($response, true);
// Check if we have a valid answer
if (isset($responseData['choices'][0]['message']['content'])) $botReply = filter_var($responseData['choices'][0]['message']['content'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
// Forward the message
return $botReply;
}
}
function jak_the_lang() {
$languages = [
'af' => 'Afrikaans',
'sq' => 'Albanian',
'am' => 'Amharic',
'ar' => 'Arabic',
'hy' => 'Armenian',
'az' => 'Azerbaijani',
'eu' => 'Basque',
'be' => 'Belarusian',
'bn' => 'Bengali',
'bs' => 'Bosnian',
'bg' => 'Bulgarian',
'ca' => 'Catalan',
'ceb' => 'Cebuano',
'ny' => 'Chichewa',
'zh' => 'Chinese (Simplified)',
'zh-TW' => 'Chinese (Traditional)',
'co' => 'Corsican',
'hr' => 'Croatian',
'cs' => 'Czech',
'da' => 'Danish',
'nl' => 'Dutch',
'en' => 'English',
'eo' => 'Esperanto',
'et' => 'Estonian',
'tl' => 'Filipino',
'fi' => 'Finnish',
'fr' => 'French',
'fy' => 'Frisian',
'gl' => 'Galician',
'ka' => 'Georgian',
'de' => 'German',
'el' => 'Greek',
'gu' => 'Gujarati',
'ht' => 'Haitian Creole',
'ha' => 'Hausa',
'haw' => 'Hawaiian',
'iw' => 'Hebrew',
'hi' => 'Hindi',
'hmn' => 'Hmong',
'hu' => 'Hungarian',
'is' => 'Icelandic',
'ig' => 'Igbo',
'id' => 'Indonesian',
'ga' => 'Irish',
'it' => 'Italian',
'ja' => 'Japanese',
'jw' => 'Javanese',
'kn' => 'Kannada',
'kk' => 'Kazakh',
'km' => 'Khmer',
'ko' => 'Korean',
'ku' => 'Kurdish (Kurmanji)',
'ky' => 'Kyrgyz',
'lo' => 'Lao',
'la' => 'Latin',
'lv' => 'Latvian',
'lt' => 'Lithuanian',
'lb' => 'Luxembourgish',
'mk' => 'Macedonian',
'mg' => 'Malagasy',
'ms' => 'Malay',
'ml' => 'Malayalam',
'mt' => 'Maltese',
'mi' => 'Maori',
'mr' => 'Marathi',
'mn' => 'Mongolian',
'my' => 'Myanmar (Burmese)',
'ne' => 'Nepali',
'no' => 'Norwegian',
'ps' => 'Pashto',
'fa' => 'Persian',
'pl' => 'Polish',
'pt' => 'Portuguese',
'pa' => 'Punjabi',
'ro' => 'Romanian',
'ru' => 'Russian',
'sm' => 'Samoan',
'gd' => 'Scots Gaelic',
'sr' => 'Serbian',
'st' => 'Sesotho',
'sn' => 'Shona',
'sd' => 'Sindhi',
'si' => 'Sinhala',
'sk' => 'Slovak',
'sl' => 'Slovenian',
'so' => 'Somali',
'es' => 'Spanish',
'su' => 'Sundanese',
'sw' => 'Swahili',
'sv' => 'Swedish',
'tg' => 'Tajik',
'ta' => 'Tamil',
'te' => 'Telugu',
'th' => 'Thai',
'tr' => 'Turkish',
'uk' => 'Ukrainian',
'ur' => 'Urdu',
'ug' => 'Uyghur',
'uz' => 'Uzbek',
'vi' => 'Vietnamese',
'cy' => 'Welsh',
'xh' => 'Xhosa',
'yi' => 'Yiddish',
'yo' => 'Yoruba',
'zu' => 'Zulu'];
return $languages;
}
?>