611 lines
20 KiB
PHP
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);
|
|
|
|
}
|
|
|
|
|
|
} |