getSession_timeout(); } } $domain = getDomain(); if (version_compare(phpversion(), '7.3', '>=')) { $cookie_options = [ 'expires' => $expires, 'path' => '/', 'domain' => $domain, 'secure' => true, 'httponly' => true, 'samesite' => 'None' ]; setcookie($cookieName, $value, $cookie_options); $cookie_options['domain'] = 'www.' . $domain; setcookie($cookieName, $value, $cookie_options); } else { setcookie($cookieName, $value, (int) $expires, "/", $domain); setcookie($cookieName, $value, (int) $expires, "/", 'www.' . $domain); } $_COOKIE[$cookieName]=$value; } function _unsetcookie($cookieName) { $domain = getDomain(); $expires = strtotime("-10 years"); $value = ''; _setcookie($cookieName, $value, $expires); setcookie($cookieName, $value, (int) $expires, "/") && setcookie($cookieName, $value, (int) $expires); setcookie($cookieName, $value, (int) $expires, "/", str_replace("www", "", $domain)); setcookie($cookieName, $value, (int) $expires, "/", "www." . $domain); setcookie($cookieName, $value, (int) $expires, "/", ".www." . $domain); setcookie($cookieName, $value, (int) $expires, "/", "." . $domain); setcookie($cookieName, $value, (int) $expires, "/", $domain); setcookie($cookieName, $value, (int) $expires, "/"); setcookie($cookieName, $value, (int) $expires); unset($_COOKIE[$cookieName]); } function _resetcookie($cookieName, $value) { _unsetcookie($cookieName); _setcookie($cookieName, $value); } // this will make sure the strring will fits in the database field function _substr($string, $start, $length = null) { // make sure the name is not chunked in case of multibyte string if (function_exists("mb_strcut")) { return mb_strcut($string, $start, $length, "UTF-8"); } else { return substr($string, $start, $length); } } function _strlen($string) { // make sure the name is not chunked in case of multibyte string if (function_exists("mb_strlen")) { return mb_strlen($string, "UTF-8"); } else { return strlen($string); } } function is_utf8($string) { return preg_match('//u', $string); } function _utf8_encode_recursive($object) { if (is_string($object)) { return is_utf8($object) ? $object : utf8_encode($object); } if (is_array($object)) { foreach ($object as $key => $value) { $object[$key] = _utf8_encode_recursive($value); } } elseif (is_object($object)) { foreach ($object as $key => $value) { $object->$key = _utf8_encode_recursive($value); } } return $object; } function _json_encode($object) { if (is_string($object)) { return $object; } if (empty($object)) { return json_encode($object); } // Ensure that all strings within the object are UTF-8 encoded $utf8_encoded_object = _utf8_encode_recursive($object); // Encode the object as JSON $json = json_encode($utf8_encoded_object); // If there's a JSON encoding error, log the error message and debug backtrace if (empty($json) && json_last_error()) { $errors[] = "_json_encode: Error Found: " . json_last_error_msg(); foreach ($errors as $value) { _error_log($value); } _error_log(json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); } return $json; } function _json_decode($object) { global $global; if (empty($object)) { return $object; } if (!is_string($object)) { return $object; } if (isValidURLOrPath($object)) { $content = file_get_contents($object); if (!empty($content)) { $object = $content; } } $json = json_decode($object); if ($json === null) { $object = str_replace(["\r", "\n"], ['\r', '\n'], $object); return json_decode($object); } else { return $json; } } function _session_write_close(){ if (isSessionStarted()) { //_error_log(json_encode(debug_backtrace())); @session_write_close(); } } function isSessionStarted() { global $customSessionHandle; if(session_status() == PHP_SESSION_NONE){ return false; } if(session_status() == PHP_SESSION_ACTIVE){ return true; } // Check if a session variable exists in Memcached if (!empty($customSessionHandle) && $customSessionHandle->get(session_id()) !== false) { return true; } else { return false; } } function session_start_preload(){ global $_session_start_preload, $global; if(empty($global['systemRootPath'])){ return false; } if(!class_exists('AVideoConf')){ require $global['systemRootPath'] . 'objects/configuration.php'; } if(!isset($_session_start_preload)){ $_session_start_preload = 1; }else{ return false; } $config = new AVideoConf(); // server should keep session data for AT LEAST 1 hour ini_set('session.gc_maxlifetime', $config->getSession_timeout()); // each client should remember their session id for EXACTLY 1 hour session_set_cookie_params($config->getSession_timeout()); //Fix “set SameSite cookie to none” warning if (version_compare(PHP_VERSION, '7.3.0') >= 0) { setcookie('key', 'value', ['samesite' => 'None', 'secure' => true]); } else { header('Set-Cookie: cross-site-cookie=name; SameSite=None; Secure'); setcookie('key', 'value', time() + $config->getSession_timeout(), '/; SameSite=None; Secure'); } } function _session_start(array $options = []) { try { session_start_preload(); if (isset($_GET['PHPSESSID']) && !_empty($_GET['PHPSESSID'])) { $PHPSESSID = $_GET['PHPSESSID']; unset($_GET['PHPSESSID']); if (!User::isLogged()) { if ($PHPSESSID !== session_id()) { _session_write_close(); session_id($PHPSESSID); //_error_log("captcha: session_id changed to {$PHPSESSID}"); } //memcachedSession(); $session = @session_start($options); if (preg_match('/objects\/getCaptcha\.php/i', $_SERVER['SCRIPT_NAME'])) { $regenerateSessionId = false; } if (!blackListRegenerateSession()) { _error_log("captcha: session_id regenerated new session_id=" . session_id()); _session_regenerate_id(); } return $session; } else { //_error_log("captcha: user logged we will not change the session ID PHPSESSID={$PHPSESSID} session_id=" . session_id()); } } elseif (!isSessionStarted()) { //_error_log(json_encode(debug_backtrace())); $start = microtime(true); //_error_log('session_start 1'); $session = @session_start($options); //_error_log('session_start 2'); $takes = microtime(true) - $start; if($takes > 1){ _error_log('session_start takes '.$takes.' seconds to open'); _error_log(json_encode(debug_backtrace())); //exit; } return $session; } } catch (Exception $exc) { _error_log("_session_start: " . $exc->getTraceAsString()); return false; } } function _session_regenerate_id() { session_regenerate_id(true); _resetcookie('PHPSESSID', session_id()); _resetcookie(session_name(), session_id()); } function uniqidV4() { $randomString = openssl_random_pseudo_bytes(16); $time_low = bin2hex(substr($randomString, 0, 4)); $time_mid = bin2hex(substr($randomString, 4, 2)); $time_hi_and_version = bin2hex(substr($randomString, 6, 2)); $clock_seq_hi_and_reserved = bin2hex(substr($randomString, 8, 2)); $node = bin2hex(substr($randomString, 10, 6)); /** * Set the four most significant bits (bits 12 through 15) of the * time_hi_and_version field to the 4-bit version number from * Section 4.1.3. * @see http://tools.ietf.org/html/rfc4122#section-4.1.3 */ $time_hi_and_version = hexdec($time_hi_and_version); $time_hi_and_version = $time_hi_and_version >> 4; $time_hi_and_version = $time_hi_and_version | 0x4000; /** * Set the two most significant bits (bits 6 and 7) of the * clock_seq_hi_and_reserved to zero and one, respectively. */ $clock_seq_hi_and_reserved = hexdec($clock_seq_hi_and_reserved); $clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved >> 2; $clock_seq_hi_and_reserved = $clock_seq_hi_and_reserved | 0x8000; return sprintf('%08s-%04s-%04x-%04x-%012s', $time_low, $time_mid, $time_hi_and_version, $clock_seq_hi_and_reserved, $node); } /** * @link https://github.com/php/php-src/issues/8218 * @return bool */ function doesPHPVersioHasOBBug() { return (version_compare(phpversion(), '8.1.4', '==') || version_compare(phpversion(), '8.0.17', '==')); }