188 lines
4.4 KiB
PHP
188 lines
4.4 KiB
PHP
<?php
|
|
namespace LiteSpeed\Lib;
|
|
|
|
/**
|
|
* Update guest vary
|
|
*
|
|
* @since 4.1
|
|
*/
|
|
class Guest {
|
|
const CONF_FILE = '.litespeed_conf.dat';
|
|
const HASH = 'hash'; // Not set-able
|
|
const O_CACHE_LOGIN_COOKIE = 'cache-login_cookie';
|
|
const O_DEBUG = 'debug';
|
|
const O_DEBUG_IPS = 'debug-ips';
|
|
const O_UTIL_NO_HTTPS_VARY = 'util-no_https_vary';
|
|
const O_GUEST_UAS = 'guest_uas';
|
|
const O_GUEST_IPS = 'guest_ips';
|
|
|
|
private static $_ip;
|
|
private static $_vary_name = '_lscache_vary'; // this default vary cookie is used for logged in status check
|
|
private $_conf = false;
|
|
|
|
/**
|
|
* Construtor
|
|
*
|
|
* @since 4.1
|
|
*/
|
|
public function __construct() {
|
|
! defined( 'LSCWP_CONTENT_FOLDER' ) && define( 'LSCWP_CONTENT_FOLDER', dirname( dirname( dirname( __DIR__ ) ) ) );
|
|
// Load config
|
|
$this->_conf = file_get_contents( LSCWP_CONTENT_FOLDER . '/' . self::CONF_FILE );
|
|
if ( $this->_conf ) {
|
|
$this->_conf = json_decode( $this->_conf, true );
|
|
}
|
|
|
|
if ( ! empty( $this->_conf[ self::O_CACHE_LOGIN_COOKIE ] ) ) {
|
|
self::$_vary_name = $this->_conf[ self::O_CACHE_LOGIN_COOKIE ];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update Guest vary
|
|
*
|
|
* @since 4.0
|
|
*/
|
|
public function update_guest_vary() {
|
|
// This process must not be cached
|
|
header( 'X-LiteSpeed-Cache-Control: no-cache' );
|
|
|
|
if ( $this->always_guest() ) {
|
|
echo '[]';
|
|
exit;
|
|
}
|
|
|
|
// If contains vary already, don't reload to avoid infinite loop when parent page having browser cache
|
|
if ( $this->_conf && self::has_vary() ) {
|
|
echo '[]';
|
|
exit;
|
|
}
|
|
|
|
// Send vary cookie
|
|
$vary = 'guest_mode:1';
|
|
if ( $this->_conf && empty( $this->_conf[ self::O_DEBUG ] ) ) {
|
|
$vary = md5( $this->_conf[ self::HASH ] . $vary );
|
|
}
|
|
|
|
$expire = time() + 2 * 86400;
|
|
$is_ssl = ! empty( $this->_conf[ self::O_UTIL_NO_HTTPS_VARY ] ) ? false : $this->is_ssl();
|
|
setcookie( self::$_vary_name, $vary, $expire, '/', false, $is_ssl, true );
|
|
|
|
// return json
|
|
echo json_encode( array( 'reload' => 'yes' ) );
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* WP's is_ssl() func
|
|
*
|
|
* @since 4.1
|
|
*/
|
|
private function is_ssl() {
|
|
if ( isset( $_SERVER['HTTPS'] ) ) {
|
|
if ( 'on' === strtolower( $_SERVER['HTTPS'] ) ) {
|
|
return true;
|
|
}
|
|
|
|
if ( '1' == $_SERVER['HTTPS'] ) {
|
|
return true;
|
|
}
|
|
} elseif ( isset( $_SERVER['SERVER_PORT'] ) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if default vary has a value
|
|
*
|
|
* @since 1.1.3
|
|
* @access public
|
|
*/
|
|
public static function has_vary() {
|
|
if ( empty( $_COOKIE[ self::$_vary_name ] ) ) {
|
|
return false;
|
|
}
|
|
return $_COOKIE[ self::$_vary_name ];
|
|
}
|
|
|
|
/**
|
|
* Detect if is a guest visitor or not
|
|
*
|
|
* @since 4.0
|
|
*/
|
|
public function always_guest() {
|
|
if ( empty( $_SERVER[ 'HTTP_USER_AGENT' ] ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( $this->_conf[ self::O_GUEST_UAS ] ) {
|
|
$quoted_uas = array();
|
|
foreach ( $this->_conf[ self::O_GUEST_UAS ] as $v ) {
|
|
$quoted_uas[] = preg_quote( $v, '#' );
|
|
}
|
|
$match = preg_match( '#' . implode( '|', $quoted_uas ) . '#i', $_SERVER[ 'HTTP_USER_AGENT' ] );
|
|
if ( $match ) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if ( $this->ip_access( $this->_conf[ self::O_GUEST_IPS ] ) ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Check if the ip is in the range
|
|
*
|
|
* @since 1.1.0
|
|
* @access public
|
|
*/
|
|
public function ip_access( $ip_list ) {
|
|
if ( ! $ip_list ) {
|
|
return false;
|
|
}
|
|
if ( ! isset( self::$_ip ) ) {
|
|
self::$_ip = self::get_ip();
|
|
}
|
|
// $uip = explode('.', $_ip);
|
|
// if(empty($uip) || count($uip) != 4) Return false;
|
|
// foreach($ip_list as $key => $ip) $ip_list[$key] = explode('.', trim($ip));
|
|
// foreach($ip_list as $key => $ip) {
|
|
// if(count($ip) != 4) continue;
|
|
// for($i = 0; $i <= 3; $i++) if($ip[$i] == '*') $ip_list[$key][$i] = $uip[$i];
|
|
// }
|
|
return in_array( self::$_ip, $ip_list );
|
|
}
|
|
|
|
/**
|
|
* Get client ip
|
|
*
|
|
* @since 1.1.0
|
|
* @since 1.6.5 changed to public
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
public static function get_ip() {
|
|
$_ip = '';
|
|
if ( function_exists( 'apache_request_headers' ) ) {
|
|
$apache_headers = apache_request_headers();
|
|
$_ip = ! empty( $apache_headers['True-Client-IP'] ) ? $apache_headers['True-Client-IP'] : false;
|
|
if ( ! $_ip ) {
|
|
$_ip = ! empty( $apache_headers['X-Forwarded-For'] ) ? $apache_headers['X-Forwarded-For'] : false;
|
|
$_ip = explode( ',', $_ip );
|
|
$_ip = $_ip[ 0 ];
|
|
}
|
|
|
|
}
|
|
|
|
if ( ! $_ip ) {
|
|
$_ip = ! empty( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : false;
|
|
}
|
|
return $_ip;
|
|
}
|
|
|
|
|
|
} |