'', 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_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_AJAX_TTL => array(), self::O_CACHE_VARY_COOKIES => array(), 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_COLLAPSE_QS => false, self::O_DEBUG_INC => array(), self::O_DEBUG_EXC => array(), self::O_DEBUG_EXC_STRINGS => 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_SELECTOR_WHITELIST => array(), self::O_OPTM_UCSS_FILE_EXC_INLINE => array(), self::O_OPTM_UCSS_EXC => array(), 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_DELAY_INC => array(), self::O_OPTM_JS_EXC => array(), self::O_OPTM_HTML_MIN => false, self::O_OPTM_HTML_LAZY => array(), self::O_OPTM_HTML_SKIP_COMMENTS => 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_DNS_PRECONNECT => array(), 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, self::O_OPTM_LOCALIZE => false, self::O_OPTM_LOCALIZE_DOMAINS => array(), // 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_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(), self::O_MEDIA_VPI => false, self::O_MEDIA_VPI_CRON => false, // 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_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_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(), self::O_QC_TOKEN => '', self::O_QC_NAMESERVERS => '', ); 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_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_VARY_COOKIES => array(), 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_COLLAPSE_QS => false, self::O_DEBUG_INC => array(), self::O_DEBUG_EXC => array(), self::O_DEBUG_EXC_STRINGS => array(), self::O_IMG_OPTM_WEBP => false, ); // 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 switch 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,trailingslash', // `Original URLs` // self::O_OPTM_LOCALIZE_DOMAINS => 'noprotocol', // `Localize Resources` // 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, self::O_QC_TOKEN); 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; } }