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); } }