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