Files
grzanieplus.pl/plugins/stUserTrackerLevelPlugin/lib/stUserTrackerLevelInterface.class.php
2025-03-12 17:06:23 +01:00

611 lines
20 KiB
PHP

<?php
/**
* @package stUserTrackerPlugin */
class stUserTrackerLevelInterface
{
public static function getCookie($name)
{
$cookies = sfContext::getInstance()->getResponse()->getCookies();
if (isset($cookies[$name]))
{
return urldecode($cookies[$name]['value']);
}
return sfContext::getInstance()->getRequest()->getCookie($name);
}
public static function getAllCookies()
{
$cookie_array = array();
$cookies = sfContext::getInstance()->getResponse()->getCookies();
foreach ($cookies as $name => $value) {
$cookie_array[] = $name;
}
foreach ($_COOKIE as $name => $value) {
$cookie_array[] = $name;
}
return $cookie_array;
}
// Tworzy cookie użytkownika
public static function addUTLCookie()
{
$config = stConfig::getInstance(sfContext::getInstance(), 'stUserTrackerLevelBackend');
$enabled_database = $config->get('enabled_database');
$hash_control = $config->get('hash_control');
$microtime = microtime(true);
// new data
$cookie_id = stUserTrackerLevelInterface::cookieEncrypt($hash_control,$microtime);
$days = $config->get('cookie_terminate');
$expires_at = time() + $days * 24 * 60 * 60;
sfContext::getInstance()->getResponse()->setCookie('utl_'.$cookie_id, "true", $expires_at);
sfContext::getInstance()->getUser()->setAttribute("utl_", 1);
if($enabled_database){
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip_address = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip_address = $_SERVER['REMOTE_ADDR'];
}
$c = new Criteria();
$c->add(stUserTrackerLevelPeer::REMOTE_ADDRESS, $ip_address);
$c->addDescendingOrderByColumn('updated_at');
$stUserTrackerLevel = stUserTrackerLevelPeer::doSelectOne($c);
if($stUserTrackerLevel){
sfContext::getInstance()->getUser()->setAttribute("utl_", 2);
}
}
$cookie = array();
$seconds = floor($microtime);
$date_time = date('Y-m-d H:i:s', $seconds);
$cookie['name'] = 'utl_'.$cookie_id;
$cookie['cookie_id'] = $cookie_id;
$cookie['created_at'] = $date_time;
return $cookie;
}
// Zwraca cookie użytkownika
public static function getUTLCookie()
{
$config = stConfig::getInstance(sfContext::getInstance(), 'stUserTrackerLevelBackend');
$hash_control = $config->get('hash_control');
$cookie_name = "";
$cookies = stUserTrackerLevelInterface::getAllCookies();
foreach ($cookies as $name) {
if (strpos($name, 'utl_') !== false) {
$cookie_name = $name;
}
}
if(!stUserTrackerLevelInterface::cookieVerify($cookie_name))
{
//wykryto manipulację danymi
stUserTrackerLevelInterface::cookieTerminate();
return false;
}
$cookie = array();
if($cookie_name != ""){
$cookie_id = explode("_",$cookie_name);
$microtime = stUserTrackerLevelInterface::cookieDecrypt($hash_control, $cookie_id[1]);
$seconds = floor($microtime);
$date_time = date('Y-m-d H:i:s', $seconds);
$cookie['name'] = $cookie_name;
$cookie['cookie_id'] = $cookie_id[1];
$cookie['created_at'] = $date_time;
}
return $cookie;
}
// Zwraca Id cookie użytkownika
public static function getUTLId()
{
$user_tracker_level_cookie = stUserTrackerLevelInterface::getUTLCookie();
return $user_tracker_level_cookie['cookie_id'];
}
// Zwraca Level użytkownika
// Level 1 = pierwszy raz na stronie
// Level 2 = powracajacy zidentyfikowany po IP
// Level 3 = powracajacy zidentyfikowany po cookies
// Level 4 = zalogowany
public static function getUTLevel()
{
$config = stConfig::getInstance(sfContext::getInstance(), 'stUserTrackerLevelBackend');
$utl_session = sfContext::getInstance()->getUser()->getAttribute("utl_",0);
$utl_cookie = stUserTrackerLevelInterface::getUTLCookie();
if($utl_cookie == false)
{
return 0;
}
$level = 1;
if($utl_session == 2)
{
$level = 2;
}
if($utl_session != 1 && $utl_session != 2)
{
$level = 3;
}
if($utl_session == 3)
{
$level = 3;
}
if (sfContext::getInstance()->getUser()->isAuthenticated() == 1)
{
$level = 4;
}
return $level;
}
// Tworzy cookie użytkownika
public static function addUTDCookie()
{
$config = stConfig::getInstance(sfContext::getInstance(), 'stUserTrackerLevelBackend');
$enabled_database = $config->get('enabled_database');
$hash_control = $config->get('hash_control');
$cookie_data = array();
$cookie_data = stUserTrackerLevelInterface::getUserInfo();
$cookie_data['return_hash'] = md5(session_id());
$cookie_data['visit_count'] = 1;
if(stUserTrackerLevelInterface::getUTLevel()==2){
$cookie_data['visit_count'] = 2;
}
$cookie_data['place_order'] = 0;
$cookie_data['product_view'] = 0;
$cookie_data['add_to_basket'] = 0;
$cookie_data = json_encode($cookie_data);
$cookie_data = stUserTrackerLevelInterface::cookieEncrypt($hash_control,$cookie_data);
$microtime = microtime(true);
// new data
$cookie_id = stUserTrackerLevelInterface::cookieEncrypt($hash_control,$microtime);
$days = $config->get('cookie_terminate');
$expires_at = time() + $days * 24 * 60 * 60;
sfContext::getInstance()->getResponse()->setCookie('utd_'.$cookie_id, $cookie_data, $expires_at);
}
// Zwraca cookie użytkownika
public static function getUTDCookie()
{
$config = stConfig::getInstance(sfContext::getInstance(), 'stUserTrackerLevelBackend');
$hash_control = $config->get('hash_control');
$cookie_name = "";
$cookies = stUserTrackerLevelInterface::getAllCookies();
foreach ($cookies as $name) {
if (strpos($name, 'utd_') !== false) {
$cookie_name = $name;
}
}
$cookie = array();
if($cookie_name != ""){
$cookie_id = explode("_",$cookie_name);
$microtime = stUserTrackerLevelInterface::cookieDecrypt($hash_control, $cookie_id[1]);
$seconds = floor($microtime);
$date_time = date('Y-m-d H:i:s', $seconds);
$cookie['name'] = $cookie_name;
$cookie['cookie_id'] = $cookie_id[1];
$cookie['created_at'] = $date_time;
$cookie_to_decrypt = stUserTrackerLevelInterface::getCookie($cookie_name);
if(stUserTrackerLevelInterface::verifyCookieDecrypt($cookie_to_decrypt))
{
$cookie_json = stUserTrackerLevelInterface::cookieDecrypt($hash_control, $cookie_to_decrypt);
}else{
//wykryto manipulację danymi
stUserTrackerLevelInterface::cookieTerminate();
return false;
}
$cookie_data = json_decode($cookie_json, true);
if(!is_array($cookie_data)){
//wykryto manipulację danymi
stUserTrackerLevelInterface::cookieTerminate();
return false;
}
$cookie = array_merge($cookie, $cookie_data);
}
return $cookie;
}
// Zwraca cookie użytkownika
public static function updateUTDCookie($update_data = false, $unset = false)
{
$config = stConfig::getInstance(sfContext::getInstance(), 'stUserTrackerLevelBackend');
$enabled_database = $config->get('enabled_database');
$hash_control = $config->get('hash_control');
$cookie_data = stUserTrackerLevelInterface::getUTDCookie();
$cookie_name = $cookie_data['name'];
$user_info = stUserTrackerLevelInterface::getUserInfo();
if($user_info['return_hash'] != $cookie_data['return_hash']){
$cookie_data['visit_count'] = $cookie_data['visit_count']+1;
}
foreach($user_info as $key => $value ){
$cookie_data[$key] = $value;
}
if(isset($update_data)){
if(is_array($update_data)){
foreach($update_data as $key => $value ){
$cookie_data[$key] = $value;
}
}
}
if($unset){
unset($cookie_data[$key]);
}
$cookie_data = json_encode($cookie_data);
$cookie_data = stUserTrackerLevelInterface::cookieEncrypt($hash_control,$cookie_data);
$days = $config->get('cookie_terminate');
$expires_at = time() + $days * 24 * 60 * 60;
sfContext::getInstance()->getResponse()->setCookie($cookie_name, $cookie_data, $expires_at);
}
// aktualizacja bazy danych
public static function updateDataBase()
{
$config = stConfig::getInstance(sfContext::getInstance(), 'stUserTrackerLevelBackend');
$enabled_database = $config->get('enabled_database');
if($enabled_database){
$utl_cookies = stUserTrackerLevelInterface::getUTLCookie();
$utd_cookies = stUserTrackerLevelInterface::getUTDCookie();
if($utd_cookies['cookie_id']!="" && $utd_cookies['system']!="" && $utd_cookies['browser']!=""){
$c = new Criteria();
$c->add(stUserTrackerLevelPeer::COOKIE_ID, $utl_cookies['cookie_id']);
$c->addDescendingOrderByColumn('updated_at');
$stUserTrackerLevel = stUserTrackerLevelPeer::doSelectOne($c);
if(!$stUserTrackerLevel)
{
$stUserTrackerLevel = new stUserTrackerLevel();
$stUserTrackerLevel->setCreatedAt($utl_cookies['created_at']);
$stUserTrackerLevel->setCookieId($utl_cookies['cookie_id']);
$stUserTrackerLevel->setUtColor(stUserTrackerLevelInterface::generateColor());
}
$stUserTrackerLevel->setUpdatedAt(date('Y-m-d H:i:s'));
$stUserTrackerLevel->setCookieUtdId($utd_cookies['cookie_id']);
$stUserTrackerLevel->setCookieUtd(json_encode($utd_cookies));
$stUserTrackerLevel->setVisitCount($utd_cookies['visit_count']);
$stUserTrackerLevel->setPlaceOrder($utd_cookies['place_order']);
$stUserTrackerLevel->setProductView($utd_cookies['product_view']);
$stUserTrackerLevel->setAddToBasket($utd_cookies['add_to_basket']);
$stUserTrackerLevel->setRemoteAddress($utd_cookies['remote_address']);
$stUserTrackerLevel->setBrowser($utd_cookies['browser']);
$stUserTrackerLevel->setSystem($utd_cookies['system']);
$stUserTrackerLevel->setHardware($utd_cookies['hardware']);
if($stUserTrackerLevel->getUtColor()==""){
$stUserTrackerLevel->setUtColor(stUserTrackerLevelInterface::generateColor());
}
$stUserTrackerLevel->save();
}
}
return true;
}
// Zwraca Id cookie użytkownika
public static function getUTDId()
{
$user_tracker_data_cookie = stUserTrackerLevelInterface::getUTDCookie();
return $user_tracker_data_cookie['cookie_id'];
}
public static function getUserInfo()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip_address = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip_address = $_SERVER['REMOTE_ADDR'];
}
$user_agent = $_SERVER['HTTP_USER_AGENT'];
if (strpos($user_agent, 'Windows') !== false) {
$system = "windows";
} elseif (strpos($user_agent, 'Mac') !== false) {
$system = "mac";
} elseif (strpos($user_agent, 'Linux') !== false) {
$system = "linux";
} else {
$system = "";
}
if (strpos($user_agent, 'Firefox') !== false) {
$browser = 'firefox';
} elseif (strpos($user_agent, 'Chrome') !== false) {
$browser = 'chrome';
} elseif (strpos($user_agent, 'Safari') !== false) {
$browser = 'safari';
} elseif (strpos($user_agent, 'Opera') !== false) {
$browser = 'opera';
} elseif (strpos($user_agent, 'Edge') !== false) {
$browser = 'edge';
} else {
$browser = '';
}
if (preg_match('/(Mobile|Android|iPhone|iPod|BlackBerry|Windows Phone)/i', $user_agent)) {
$hardware = "mobile";
} else {
$hardware = "desktop";
}
$response['updated_at'] = date('Y-m-d H:i:s');
$response['return_hash'] = md5(session_id());
$response['remote_address'] = $ip_address;
$response['browser'] = $browser;
$response['system'] = $system;
$response['hardware'] = $hardware;
return $response;
}
// Zwraca aktywność użytkownika na stronie
public static function getIsActive($cookie_id)
{
if($cookie_id=="test"){
$random_number = rand(1, 100);
if ($random_number <= 80) {
return false;
} else {
return true;
}
}
$c = new Criteria();
$c->add(stUserTrackerLevelPeer::COOKIE_ID, $cookie_id);
$c->addDescendingOrderByColumn('updated_at');
$stUserTrackerLevel = stUserTrackerLevelPeer::doSelectOne($c);
if($stUserTrackerLevel){
$date_time = $stUserTrackerLevel->getUpdatedAt();
$timestamp = strtotime($date_time);
$now = time();
if ($now - $timestamp >= 70) {
return false;
}
return true;
}
}
public static function cookieEncrypt($key, $data)
{
$ivlen = openssl_cipher_iv_length($cipher="AES-256-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt($data, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hex_iv = bin2hex($iv);
$hex_ciphertext = bin2hex($ciphertext);
return $hex_iv.$hex_ciphertext;
}
public static function cookieDecrypt($key, $hex_encrypted)
{
$ivlen = openssl_cipher_iv_length($cipher="AES-256-CBC");
$hex_iv = substr($hex_encrypted, 0, 2*$ivlen);
$hex_ciphertext = substr($hex_encrypted, 2*$ivlen);
$iv = hex2bin($hex_iv);
$ciphertext = @hex2bin($hex_ciphertext);
$data = openssl_decrypt($ciphertext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
return $data;
}
public static function verifyCookieDecrypt($hex_encrypted)
{
if (!ctype_xdigit($hex_encrypted)) {
// Nieprawidłowy format ciągu szesnastkowego.
return false;
}
$ivlen = openssl_cipher_iv_length($cipher="AES-256-CBC");
if (strlen($hex_encrypted) < 2*$ivlen) {
//Ciąg szesnastkowy jest zbyt krótki.
return false;
}
return true;
}
public static function cookieVerify($cookie_name)
{
$config = stConfig::getInstance(sfContext::getInstance(), 'stUserTrackerLevelBackend');
$hash_control = $config->get('hash_control');
$cookie_id = explode("_",$cookie_name);
$microtime = stUserTrackerLevelInterface::cookieDecrypt($hash_control, $cookie_id[1]);
$seconds = floor($microtime);
$date_time = date('Y-m-d', $seconds);
if ($date_time == "1970-01-01")
{
return false;
}
else
{
return true;
}
}
public static function cookieTerminate()
{
$cookies = stUserTrackerLevelInterface::getAllCookies();
foreach ($cookies as $cookie_name) {
if (strpos($cookie_name, 'utl_') !== false) {
$expires_at = time() -3600;
sfContext::getInstance()->getResponse()->setCookie($cookie_name, "false", $expires_at);
}
if (strpos($cookie_name, 'utd_') !== false) {
$expires_at = time() -3600;
sfContext::getInstance()->getResponse()->setCookie($cookie_name, "false", $expires_at);
}
}
$url = sfContext::getInstance()->getController()->genUrl('@homepage');
sfContext::getInstance()->getController()->redirect($url);
}
// generowanie pastelowego koloru
public static function generateColor()
{
$red = mt_rand(128, 245);
$green = mt_rand(128, 245);
$blue = mt_rand(128, 245);
// Konwersja RGB na HEX
$hex = "#" . dechex($red) . dechex($green) . dechex($blue);
return $hex;
}
// dodanie danych do ciastka UTD
public static function setUTDValue($key, $value)
{
$data[$key] = $value;
stUserTrackerLevelInterface::updateUTDCookie($data);
return $value;
}
// pobranie danych do ciastka UTD
public static function getUTDValue($key)
{
$utd_cookies = stUserTrackerLevelInterface::getUTDCookie();
return $utd_cookies[$key];
}
// usunięcie danych do ciastka UTD
public static function unsetUTDValue($key)
{
$data[$key] = false;
stUserTrackerLevelInterface::updateUTDCookie($data, true);
}
}