'', self::HASH => '', self::O_AUTO_UPGRADE => false, self::O_API_KEY => '', self::O_SERVER_IP => '', self::O_GUEST => false, self::O_GUEST_OPTM => false, self::O_NEWS => false, self::O_GUEST_UAS => array(), self::O_GUEST_IPS => array(), // Cache self::O_CACHE => false, self::O_CACHE_PRIV => false, self::O_CACHE_COMMENTER => false, self::O_CACHE_REST => false, self::O_CACHE_PAGE_LOGIN => false, self::O_CACHE_FAVICON => false, self::O_CACHE_RES => false, self::O_CACHE_MOBILE => false, self::O_CACHE_MOBILE_RULES => array(), self::O_CACHE_BROWSER => false, self::O_CACHE_EXC_USERAGENTS => array(), self::O_CACHE_EXC_COOKIES => array(), self::O_CACHE_EXC_QS => array(), self::O_CACHE_EXC_CAT => array(), self::O_CACHE_EXC_TAG => array(), self::O_CACHE_FORCE_URI => array(), self::O_CACHE_FORCE_PUB_URI => array(), self::O_CACHE_PRIV_URI => array(), self::O_CACHE_EXC => array(), self::O_CACHE_EXC_ROLES => array(), self::O_CACHE_DROP_QS => array(), self::O_CACHE_TTL_PUB => 0, self::O_CACHE_TTL_PRIV => 0, self::O_CACHE_TTL_FRONTPAGE => 0, self::O_CACHE_TTL_FEED => 0, self::O_CACHE_TTL_REST => 0, self::O_CACHE_TTL_BROWSER => 0, self::O_CACHE_TTL_STATUS => array(), self::O_CACHE_LOGIN_COOKIE => '', self::O_CACHE_VARY_GROUP => array(), // Purge self::O_PURGE_ON_UPGRADE => false, self::O_PURGE_STALE => false, self::O_PURGE_POST_ALL => false, self::O_PURGE_POST_FRONTPAGE => false, self::O_PURGE_POST_HOMEPAGE => false, self::O_PURGE_POST_PAGES => false, self::O_PURGE_POST_PAGES_WITH_RECENT_POSTS => false, self::O_PURGE_POST_AUTHOR => false, self::O_PURGE_POST_YEAR => false, self::O_PURGE_POST_MONTH => false, self::O_PURGE_POST_DATE => false, self::O_PURGE_POST_TERM => false, self::O_PURGE_POST_POSTTYPE => false, self::O_PURGE_TIMED_URLS => array(), self::O_PURGE_TIMED_URLS_TIME => '', self::O_PURGE_HOOK_ALL => array(), // ESI self::O_ESI => false, self::O_ESI_CACHE_ADMBAR => false, self::O_ESI_CACHE_COMMFORM => false, self::O_ESI_NONCE => array(), // Util self::O_UTIL_INSTANT_CLICK => false, self::O_UTIL_NO_HTTPS_VARY => false, // Debug self::O_DEBUG_DISABLE_ALL => false, self::O_DEBUG => false, self::O_DEBUG_IPS => array(), self::O_DEBUG_LEVEL => false, self::O_DEBUG_FILESIZE => 0, self::O_DEBUG_COOKIE => false, self::O_DEBUG_COLLAPS_QS => false, self::O_DEBUG_INC => array(), self::O_DEBUG_EXC => array(), // DB Optm self::O_DB_OPTM_REVISIONS_MAX => 0, self::O_DB_OPTM_REVISIONS_AGE => 0, // HTML Optm self::O_OPTM_CSS_MIN => false, self::O_OPTM_CSS_COMB => false, self::O_OPTM_CSS_COMB_EXT_INL => false, self::O_OPTM_UCSS => false, self::O_OPTM_UCSS_INLINE => false, self::O_OPTM_UCSS_WHITELIST => array(), self::O_OPTM_UCSS_EXC => array(), self::O_OPTM_CSS_HTTP2 => false, self::O_OPTM_CSS_EXC => array(), self::O_OPTM_JS_MIN => false, self::O_OPTM_JS_COMB => false, self::O_OPTM_JS_COMB_EXT_INL => false, self::O_OPTM_JS_HTTP2 => false, self::O_OPTM_JS_EXC => array(), self::O_OPTM_HTML_MIN => false, self::O_OPTM_HTML_LAZY => array(), self::O_OPTM_QS_RM => false, self::O_OPTM_GGFONTS_RM => false, self::O_OPTM_CSS_ASYNC => false, self::O_OPTM_CCSS_PER_URL => false, self::O_OPTM_CCSS_SEP_POSTTYPE => array(), self::O_OPTM_CCSS_SEP_URI => array(), self::O_OPTM_CSS_ASYNC_INLINE => false, self::O_OPTM_CSS_FONT_DISPLAY => false, self::O_OPTM_JS_DEFER => false, self::O_OPTM_EMOJI_RM => false, self::O_OPTM_NOSCRIPT_RM => false, self::O_OPTM_GGFONTS_ASYNC => false, self::O_OPTM_EXC_ROLES => array(), self::O_OPTM_CCSS_CON => '', self::O_OPTM_JS_DEFER_EXC => array(), self::O_OPTM_GM_JS_EXC => array(), self::O_OPTM_DNS_PREFETCH => array(), self::O_OPTM_DNS_PREFETCH_CTRL => false, self::O_OPTM_EXC => array(), self::O_OPTM_GUEST_ONLY => false, // Object self::O_OBJECT => false, self::O_OBJECT_KIND => false, self::O_OBJECT_HOST => '', self::O_OBJECT_PORT => 0, self::O_OBJECT_LIFE => 0, self::O_OBJECT_PERSISTENT => false, self::O_OBJECT_ADMIN => false, self::O_OBJECT_TRANSIENTS => false, self::O_OBJECT_DB_ID => 0, self::O_OBJECT_USER => '', self::O_OBJECT_PSWD => '', self::O_OBJECT_GLOBAL_GROUPS => array(), self::O_OBJECT_NON_PERSISTENT_GROUPS => array(), // Discuss self::O_DISCUSS_AVATAR_CACHE => false, self::O_DISCUSS_AVATAR_CRON => false, self::O_DISCUSS_AVATAR_CACHE_TTL => 0, // Media self::O_MEDIA_LAZY => false, self::O_MEDIA_LAZY_PLACEHOLDER => '', self::O_MEDIA_PLACEHOLDER_RESP => false, self::O_MEDIA_PLACEHOLDER_RESP_COLOR => '', self::O_MEDIA_PLACEHOLDER_RESP_SVG => '', self::O_MEDIA_LQIP => false, self::O_MEDIA_LQIP_QUAL => 0, self::O_MEDIA_LQIP_MIN_W => 0, self::O_MEDIA_LQIP_MIN_H => 0, self::O_MEDIA_PLACEHOLDER_RESP_ASYNC => false, self::O_MEDIA_IFRAME_LAZY => false, self::O_MEDIA_ADD_MISSING_SIZES => false, self::O_MEDIA_LAZYJS_INLINE => false, self::O_MEDIA_LAZY_EXC => array(), self::O_MEDIA_LAZY_CLS_EXC => array(), self::O_MEDIA_LAZY_PARENT_CLS_EXC => array(), self::O_MEDIA_IFRAME_LAZY_CLS_EXC => array(), self::O_MEDIA_IFRAME_LAZY_PARENT_CLS_EXC => array(), self::O_MEDIA_LAZY_URI_EXC => array(), self::O_MEDIA_LQIP_EXC => array(), // Image Optm self::O_IMG_OPTM_AUTO => false, self::O_IMG_OPTM_CRON => false, self::O_IMG_OPTM_ORI => false, self::O_IMG_OPTM_RM_BKUP => false, self::O_IMG_OPTM_WEBP => false, self::O_IMG_OPTM_LOSSLESS => false, self::O_IMG_OPTM_EXIF => false, self::O_IMG_OPTM_WEBP_REPLACE => false, self::O_IMG_OPTM_WEBP_ATTR => array(), self::O_IMG_OPTM_WEBP_REPLACE_SRCSET => false, self::O_IMG_OPTM_JPG_QUALITY => 0, // Crawler self::O_CRAWLER => false, self::O_CRAWLER_USLEEP => 0, self::O_CRAWLER_RUN_DURATION => 0, self::O_CRAWLER_RUN_INTERVAL => 0, self::O_CRAWLER_CRAWL_INTERVAL => 0, self::O_CRAWLER_THREADS => 0, self::O_CRAWLER_TIMEOUT => 0, self::O_CRAWLER_LOAD_LIMIT => 0, self::O_CRAWLER_SITEMAP => '', self::O_CRAWLER_DROP_DOMAIN => false, self::O_CRAWLER_MAP_TIMEOUT => 0, self::O_CRAWLER_ROLES => array(), self::O_CRAWLER_COOKIES => array(), // Misc self::O_MISC_HTACCESS_FRONT => '', self::O_MISC_HTACCESS_BACK => '', self::O_MISC_HEARTBEAT_FRONT => false, self::O_MISC_HEARTBEAT_FRONT_TTL => 0, self::O_MISC_HEARTBEAT_BACK => false, self::O_MISC_HEARTBEAT_BACK_TTL => 0, self::O_MISC_HEARTBEAT_EDITOR => false, self::O_MISC_HEARTBEAT_EDITOR_TTL => 0, // CDN self::O_CDN => false, self::O_CDN_ORI => array(), self::O_CDN_ORI_DIR => array(), self::O_CDN_EXC => array(), self::O_CDN_QUIC => false, self::O_CDN_CLOUDFLARE => false, self::O_CDN_CLOUDFLARE_EMAIL => '', self::O_CDN_CLOUDFLARE_KEY => '', self::O_CDN_CLOUDFLARE_NAME => '', self::O_CDN_CLOUDFLARE_ZONE => '', self::O_CDN_MAPPING => array(), self::O_CDN_ATTR => array(), ); protected static $_default_site_options = array( self::_VER => '', self::O_CACHE => false, self::NETWORK_O_USE_PRIMARY => false, self::O_AUTO_UPGRADE => false, self::O_GUEST => false, self::O_CACHE_FAVICON => false, self::O_CACHE_RES => false, self::O_CACHE_BROWSER => false, self::O_CACHE_MOBILE => false, self::O_CACHE_MOBILE_RULES => array(), self::O_CACHE_LOGIN_COOKIE => '', self::O_CACHE_EXC_COOKIES => array(), self::O_CACHE_EXC_USERAGENTS => array(), self::O_CACHE_TTL_BROWSER => 0, self::O_PURGE_ON_UPGRADE => false, self::O_OBJECT => false, self::O_OBJECT_KIND => false, self::O_OBJECT_HOST => '', self::O_OBJECT_PORT => 0, self::O_OBJECT_LIFE => 0, self::O_OBJECT_PERSISTENT => false, self::O_OBJECT_ADMIN => false, self::O_OBJECT_TRANSIENTS => false, self::O_OBJECT_DB_ID => 0, self::O_OBJECT_USER => '', self::O_OBJECT_PSWD => '', self::O_OBJECT_GLOBAL_GROUPS => array(), self::O_OBJECT_NON_PERSISTENT_GROUPS => array(), // Debug self::O_DEBUG_DISABLE_ALL => false, self::O_DEBUG => false, self::O_DEBUG_IPS => array(), self::O_DEBUG_LEVEL => false, self::O_DEBUG_FILESIZE => 0, self::O_DEBUG_COOKIE => false, self::O_DEBUG_COLLAPS_QS => false, self::O_DEBUG_INC => array(), self::O_DEBUG_EXC => array(), self::O_IMG_OPTM_WEBP_REPLACE => false, self::O_MISC_HTACCESS_FRONT => '', self::O_MISC_HTACCESS_BACK => '', ); // NOTE: all the val of following items will be int while not bool protected static $_multi_switch_list = array( self::O_DEBUG => 2, self::O_OPTM_JS_DEFER => 2, ); /** * Correct the option type * * TODO: add similar network func * * @since 3.0.3 */ protected function type_casting( $val, $id, $is_site_conf = false ) { $default_v = ! $is_site_conf ? self::$_default_options[ $id ] : self::$_default_site_options[ $id ]; if ( is_bool( $default_v ) ) { if ( $val === 'true' ) { $val = true; } if ( $val === 'false' ) { $val = false; } $max = $this->_conf_multi_switch( $id ); if ( $max ) { $val = (int) $val; $val %= $max + 1; } else { $val = (bool) $val; } } elseif ( is_array( $default_v ) ) { // from textarea input if ( ! is_array( $val ) ) { $val = Utility::sanitize_lines( $val, $this->_conf_filter( $id ) ); } } elseif ( ! is_string( $default_v ) ) { $val = (int) $val; } else { // Check if the string has a limit set $val = $this->_conf_string_val( $id, $val ); } return $val; } /** * Load default network settings from data.ini * * @since 3.0 */ public function load_default_site_vals() { // Load network_default.ini if ( file_exists( LSCWP_DIR . 'data/const.network_default.ini' ) ) { $default_ini_cfg = parse_ini_file( LSCWP_DIR . 'data/const.network_default.ini', true ); foreach ( self::$_default_site_options as $k => $v ) { if ( ! array_key_exists( $k, $default_ini_cfg ) ) { continue; } // Parse value in ini file $ini_v = $this->type_casting( $default_ini_cfg[ $k ], $k, true ); if ( $ini_v == $v ) { continue; } self::$_default_site_options[ $k ] = $ini_v; } } self::$_default_site_options[ self::_VER ] = Core::VER; return self::$_default_site_options; } /** * Load default values from default.ini * * @since 3.0 * @access public */ public function load_default_vals() { // Load default.ini if ( file_exists( LSCWP_DIR . 'data/const.default.ini' ) ) { $default_ini_cfg = parse_ini_file( LSCWP_DIR . 'data/const.default.ini', true ); foreach ( self::$_default_options as $k => $v ) { if ( ! array_key_exists( $k, $default_ini_cfg ) ) { continue; } // Parse value in ini file $ini_v = $this->type_casting( $default_ini_cfg[ $k ], $k ); // NOTE: Multiple lines value must be stored as array /** * Special handler for CDN_mapping * * format in .ini: * [cdn-mapping] * url[0] = 'https://example.com/' * inc_js[0] = true * filetype[0] = '.css * .js * .jpg' * * format out: * [0] = [ 'url' => 'https://example.com', 'inc_js' => true, 'filetype' => [ '.css', '.js', '.jpg' ] ] */ if ( $k == self::O_CDN_MAPPING ) { $mapping_fields = array( self::CDN_MAPPING_URL, self::CDN_MAPPING_INC_IMG, self::CDN_MAPPING_INC_CSS, self::CDN_MAPPING_INC_JS, self::CDN_MAPPING_FILETYPE, // Array ); $ini_v2 = array(); foreach ( $ini_v[ self::CDN_MAPPING_URL ] as $k2 => $v2 ) {// $k2 is numeric $this_row = array(); foreach ( $mapping_fields as $v3 ) { $this_v = ! empty( $ini_v[ $v3 ][ $k2 ] ) ? $ini_v[ $v3 ][ $k2 ] : false; if ( $v3 == self::CDN_MAPPING_URL ) { $this_v = $this_v ? : ''; } if ( $v3 == self::CDN_MAPPING_FILETYPE ) { $this_v = $this_v ? Utility::sanitize_lines( $this_v ) : array(); // Note: Since v3.0 its already an array } $this_row[ $v3 ] = $this_v; } $ini_v2[ $k2 ] = $this_row; } $ini_v = $ini_v2; } if ( $ini_v == $v ) { continue; } self::$_default_options[ $k ] = $ini_v; } } // Load internal default vals // Setting the default bool to int is also to avoid type casting override it back to bool self::$_default_options[ self::O_CACHE ] = is_multisite() ? self::VAL_ON2 : self::VAL_ON; //For multi site, default is 2 (Use Network Admin Settings). For single site, default is 1 (Enabled). // Load default vals containing variables if ( ! self::$_default_options[ self::O_CDN_ORI_DIR ] ) { self::$_default_options[ self::O_CDN_ORI_DIR ] = LSCWP_CONTENT_FOLDER . "\nwp-includes"; self::$_default_options[ self::O_CDN_ORI_DIR ] = explode( "\n", self::$_default_options[ self::O_CDN_ORI_DIR ] ); self::$_default_options[ self::O_CDN_ORI_DIR ] = array_map( 'trim', self::$_default_options[ self::O_CDN_ORI_DIR ] ); } // Set security key if not initialized yet if ( ! self::$_default_options[ self::HASH ] ) { self::$_default_options[ self::HASH ] = Str::rrand( 32 ); } self::$_default_options[ self::_VER ] = Core::VER; return self::$_default_options; } /** * Format the string value * * @since 3.0 */ protected function _conf_string_val( $id, $val ) { return $val; } /** * If the switch setting is a triple value or not * * @since 3.0 */ protected function _conf_multi_switch( $id ) { if ( ! empty( self::$_multi_switch_list[ $id ] ) ) { return self::$_multi_switch_list[ $id ]; } if ( $id == self::O_CACHE && is_multisite() ) { return self::VAL_ON2; } return false; } /** * Append a new multi swith max limit for the bool option * * @since 3.0 */ public static function set_multi_switch( $id, $v ) { self::$_multi_switch_list[ $id ] = $v; } /** * Generate const name based on $id * * @since 3.0 */ public static function conf_const( $id ) { return 'LITESPEED_CONF__' . strtoupper( str_replace( '-', '__', $id ) ); } /** * Filter to be used when saving setting * * @since 3.0 */ protected function _conf_filter( $id ) { $filters = array( self::O_MEDIA_LAZY_EXC => 'uri', self::O_DEBUG_INC => 'relative', self::O_DEBUG_EXC => 'relative', self::O_MEDIA_LAZY_URI_EXC => 'relative', self::O_CACHE_PRIV_URI => 'relative', self::O_PURGE_TIMED_URLS => 'relative', self::O_CACHE_FORCE_URI => 'relative', self::O_CACHE_FORCE_PUB_URI => 'relative', self::O_CACHE_EXC => 'relative', // self::O_OPTM_CSS_EXC => 'uri', // Need to comment out for inline & external CSS // self::O_OPTM_JS_EXC => 'uri', self::O_OPTM_EXC => 'relative', self::O_OPTM_CCSS_SEP_URI => 'uri', // self::O_OPTM_JS_DEFER_EXC => 'uri', self::O_OPTM_DNS_PREFETCH => 'domain', self::O_CDN_ORI => 'noprotocol', // `Original URLs` // self:: => '', // self:: => '', ); if ( ! empty( $filters[ $id ] ) ) { return $filters[ $id ]; } return false; } /** * If the setting changes worth a purge or not * * @since 3.0 */ protected function _conf_purge( $id ) { $check_ids = array( self::O_MEDIA_LAZY_URI_EXC, self::O_OPTM_EXC, self::O_CACHE_PRIV_URI, self::O_PURGE_TIMED_URLS, self::O_CACHE_FORCE_URI, self::O_CACHE_FORCE_PUB_URI, self::O_CACHE_EXC, ); return in_array( $id, $check_ids ); } /** * If the setting changes worth a purge ALL or not * * @since 3.0 */ protected function _conf_purge_all( $id ) { $check_ids = array( self::O_CACHE, self::O_ESI, self::O_DEBUG_DISABLE_ALL, self::NETWORK_O_USE_PRIMARY, ); return in_array( $id, $check_ids ); } /** * If the setting is a pswd or not * * @since 3.0 */ protected function _conf_pswd( $id ) { $check_ids = array( self::O_CDN_CLOUDFLARE_KEY, self::O_OBJECT_PSWD, self::O_API_KEY, ); return in_array( $id, $check_ids ); } /** * If the setting is cron related or not * * @since 3.0 */ protected function _conf_cron( $id ) { $check_ids = array( self::O_IMG_OPTM_CRON, self::O_OPTM_CSS_ASYNC, self::O_MEDIA_PLACEHOLDER_RESP_ASYNC, self::O_DISCUSS_AVATAR_CRON, self::O_IMG_OPTM_AUTO, self::O_CRAWLER, ); return in_array( $id, $check_ids ); } /** * If the setting changes worth a purge, return the tag * * @since 3.0 */ protected function _conf_purge_tag( $id ) { $check_ids = array( self::O_CACHE_PAGE_LOGIN => Tag::TYPE_LOGIN, ); if ( ! empty( $check_ids[ $id ] ) ) { return $check_ids[ $id ]; } return false; } /** * Generate server vars * * @since 2.4.1 */ public function server_vars() { $consts = array( 'WP_SITEURL', 'WP_HOME', 'WP_CONTENT_DIR', 'SHORTINIT', 'LSCWP_CONTENT_DIR', 'LSCWP_CONTENT_FOLDER', 'LSCWP_DIR', 'LITESPEED_TIME_OFFSET', 'LITESPEED_SERVER_TYPE', 'LITESPEED_CLI', 'LITESPEED_ALLOWED', 'LITESPEED_ON', 'LSWCP_TAG_PREFIX', 'COOKIEHASH', ); $server_vars = array(); foreach ( $consts as $v ) { $server_vars[ $v ] = defined( $v ) ? constant( $v ) : NULL; } return $server_vars; } }