|
|
Название проекта: |
Счётчик запросов
|
Кто разместил: |
Внешний проект с weblancer.net
|
Открыт: |
08-Nov-2021 10:25 GMT |
Описание: |
Счётчик запросов 20-25ч 250$
<?php
/**
* Функционал позволяющий отследить закрытие окна браузера и деавторизовать пользователя.
* Используются keepalive посылки.
* Иных способов отследить закрытие окна браузера НЕТ.
* window.onunload = function() сработает и при переходе на другой URL или отправке формы.
*
*/
NG_Core::add_page_assets( 'auth_keepalive_code' );
function auth_keepalive_code() {
if ( ! is_user_logged_in() ) {
return;
}
$interval = (int) floor( USER_INVALIDATE_AFTER / 3 ) * 1000;
?>
<script type="application/javascript">
jQuery(document).ready(function ($) {
setInterval(function () {
$.get(ajax_url, {
ajax_action: 'keepalive',
}
);
}, <?php echo $interval; ?>);
// Global AJAX Error handler
$(document).ajaxError(function (event, jqXHR, settings, errorThrown) {
if (jqXHR.status === 403) {
window.location.assign('<?php echo ng_get_site_url(); ?>');
}
});
});
</script>
<?php
}
NG_Ajax::add_ajax_handler( 'keepalive', function () {
if ( NG_User::update_auth_cookies() ) {
echo 'I hear you.';
return;
}
header( 'HTTP/1.0 403 Access Forbidden', true, 403 );
echo 'Nope!';
} );
/**
* Class NG_User
*
* Авторизация пользователя. Сессии пользователя.
*
*
*/
class NG_User {
private static $user_id = false;
private static $auth_callback = null;
private static $pass = '';
static function determine_user() {
// Logging in
if ( cm_is_auth_request()
&& cm_is_http_post() ) {
if ( ( $name = cm_get_post( 'name', '+' ) )
&& ( $pass = cm_get_post( 'pass' ) ) ) {
if ( ! self::authenticate_user( $name, $pass ) ) {
ng_add_error_notice( 'Неверный пароль или имя пользователя.' );
return false;
}
else {
NG_Core::do_action( 'authenticated', self::$user_id );
}
}
// No further processing is needed
header( "Location: " . ng_get_site_url(), true );
exit;
}
if ( ! empty( self::$user_id ) ) {
return self::$user_id;
}
// Determining logged-in user
self::$user_id = false;
if ( ( $sid = cm_get_cookie( USER_AUTH_COOKIE_UID ) )
&& ( $hash = cm_get_cookie( USER_AUTH_COOKIE_HASH ) )
&& ( $expires = cm_get_cookie( USER_AUTH_COOKIE_EXPIRES ) )
&& ( $ka = cm_get_cookie( USER_AUTH_COOKIE_KEEPALIVE ) ) ) {
if ( hash_equals( $hash, self::create_hash( array( $sid, $expires, $ka ) ) ) ) {
if ( $expires < time()
|| $ka < time() ) {
self::logout();
return false;
}
self::$user_id = $sid;
/*if ( USER_AUTH_SAVE_PWD ) {
self::$pass = cm_array_get( $_SESSION, 'pass' );
if ( ! self::$pass ) {
self::$user_id = false;
}
}*/
}
}
// Logging out
if ( cm_is_auth_request()
&& ! cm_is_http_post()
&& ( 'logout' == cm_array_get( $_GET, 'action' ) ) ) {
self::logout();
}
return self::$user_id;
}
static function authenticate_user( $user_name, $pass ) {
if ( ! is_callable( self::$auth_callback ) ) {
return false;
}
if ( self::$user_id = call_user_func( self::$auth_callback, $user_name, $pass ) ) {
//setcookie( USER_AUTH_COOKIE_UID, $user_name, time() + USER_AUTH_VALID, '/' );
//setcookie( USER_AUTH_COOKIE_HASH, self::user_hash( $user_name ), time() + USER_AUTH_VALID, '/' );
self::set_auth_cookies( $user_name );
self::$pass = $pass;
/*if ( USER_AUTH_SAVE_PWD ) {
$_SESSION = $pass;
}*/
}
return self::$user_id;
}
static function set_auth_cookies( $user_name ) {
$expire = time() + USER_AUTH_VALID;
setcookie( USER_AUTH_COOKIE_EXPIRES, $expire, $expire, '/' );
setcookie( USER_AUTH_COOKIE_UID, $user_name, $expire, '/' );
$ka = time() + USER_INVALIDATE_AFTER;
setcookie( USER_AUTH_COOKIE_KEEPALIVE, $ka, $expire, '/' );
setcookie( USER_AUTH_COOKIE_HASH, self::create_hash( array( $user_name, $expire, $ka ) ), $expire, '/' );
}
static function update_auth_cookies() {
if ( ! self::determine_user() ) {
false;
}
$user_name = cm_get_cookie( USER_AUTH_COOKIE_UID );
$expire = cm_get_cookie( USER_AUTH_COOKIE_EXPIRES );
if ( ! $user_name
|| ! $expire ) {
return false;
}
$ka = time() + USER_INVALIDATE_AFTER;
setcookie( USER_AUTH_COOKIE_KEEPALIVE, $ka, $expire, '/' );
setcookie( USER_AUTH_COOKIE_HASH, self::create_hash( array( $user_name, $expire, $ka ) ), $expire, '/' );
return true;
}
/**
* @param array $params
*
* @return string
*/
static function create_hash( $params ) {
return hash( 'sha512', implode( '|', $params ) . USER_AUTH_SALT );
}
/**
* @param $callback
*
* @return bool
*/
static function add_authenticator( $callback ) {
if ( is_callable( $callback ) ) {
self::$auth_callback = $callback;
return true;
}
return false;
}
static function is_logged_in() {
return ! empty ( self::$user_id );
}
static function get_user_id() {
return self::$user_id;
}
static function get_user_pass() {
/*if ( USER_AUTH_SAVE_PWD ) {
return self::$pass;
}
return '';*/
}
static function logout() {
NG_Core::do_action( 'logout', self::$user_id );
self::$user_id = false;
self::$pass = '';
setcookie( USER_AUTH_COOKIE_UID, 'X', time() - 1, '/' );
setcookie( USER_AUTH_COOKIE_HASH, 'X', time() - 1, '/' );
/*if ( USER_AUTH_SAVE_PWD ) {
$_SESSION = array();
if ( session_status() === PHP_SESSION_ACTIVE ) {
session_destroy();
}
}*/
NG_Core::do_action( 'logged_out' );
}
} |
Project ID:
|
4154034 |
Категория проекта: |
|
Бюджет проекта: |
|
|
|
|
|
|
|
|