<?php
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
class WPH_functions
{
var $wph;
function __construct()
{
global $wph;
$this->wph = &$wph;
}
function get_module_component_default_setting()
{
$defaults = array (
'type' => 'component',
'id' => '',
'visible' => TRUE,
'label' => '',
'description' => '',
'value_description' => '',
'input_type' => 'text',
'default_value' => '',
'sanitize_type' => array('sanitize_title'),
'help' => FALSE,
'advanced_option' => FALSE,
'options_pre' => '',
'options' => array(),
'options_post' => '',
'interface_help_split' => TRUE,
//callback function when components run. Default being set for _init_{$field_id}
'callback' => '',
//callback function to return the rewrite code, Default being set for _callback_saved_{$field_id}
'callback_saved' => '',
//PassThrough any additional arguments
'callback_arguments' => array(),
//conditional to render html for module component option
'display_conditions' => array(),
//custom html render content for this module component option
'module_option_html_render' => '',
//custom processing (interface save) for this module component option
'module_option_processing' => '',
//processing order, lower means it will be processed earlier
'processing_order' => 10,
);
return $defaults;
}
/**
* Filter module comonent settings (set-up), by removing splits ( if $strip_splits ), and fill in default values for settings with empty data
*
* @param mixed $module_settings
* @param mixed $strip_splits
*/
function filter_settings($module_settings, $strip_splits = FALSE)
{
if(!is_array($module_settings) || count($module_settings) < 1)
return $module_settings;
$defaults = $this->get_module_component_default_setting();
foreach($module_settings as $key => $module_setting)
{
if(isset($module_setting['type']) && $module_setting['type'] == 'split')
{
if($strip_splits === TRUE)
unset($module_settings[$key]);
continue;
}
$module_setting = wp_parse_args( $module_setting, $defaults );
switch($module_setting['input_type'])
{
case 'text' :
$defaults_type = array (
'placeholder' => '',
);
$module_setting = wp_parse_args( $module_setting, $defaults_type );
break;
}
$module_settings[$key] = $module_setting;
}
$module_settings = array_values($module_settings);
return $module_settings;
}
/**
* Attempt to copy the mu loader within mu-plugins folder
*
*/
static function copy_mu_loader( $force_overwrite = FALSE )
{
//check if mu-plugins folder exists
if(! is_dir( WPMU_PLUGIN_DIR ))
{
if (! wp_mkdir_p( WPMU_PLUGIN_DIR ) )
return;
}
//check if file actually exists already
if( ! $force_overwrite )
{
if( file_exists(WPMU_PLUGIN_DIR . '/wp-hide-loader.php' ))
return;
}
//attempt to copy the file
@copy( WP_PLUGIN_DIR . '/wp-hide-security-enhancer-pro/mu-loader/wp-hide-loader.php', WPMU_PLUGIN_DIR . '/wp-hide-loader.php' );
}
/**
* Attempt to remove the mu loader
*
*/
static function unlink_mu_loader()
{
//check if file actually exists already
if( !file_exists(WPMU_PLUGIN_DIR . '/wp-hide-loader.php' ))
return;
//attempt to copy the file
@unlink ( WPMU_PLUGIN_DIR . '/wp-hide-loader.php' );
}
/**
* Return the wp-config.php path depending on WordPress set-up type
* Some WordPress installs might have wp-config file outside root directory. one level up
*
*/
static public function get_wp_config_path()
{
if ( file_exists( ABSPATH . 'wp-config.php' ) )
{
return ( ABSPATH . 'wp-config.php' );
}
elseif ( @file_exists( dirname( ABSPATH ) . '/wp-config.php' ) && ! @file_exists( dirname( ABSPATH ) . '/wp-settings.php' ) )
{
return ( dirname( ABSPATH ) . '/wp-config.php' );
}
}
/**
* Check if the required lines exists within wp_config.php
*
* @param mixed $update
*/
function check_wp_config( $update = TRUE )
{
if ( defined('WPH_WPCONFIG_LOADER') && WPH_WPCONFIG_LOADER === TRUE )
return TRUE;
$existing_data = $this->extract_from_markers( $this->get_wp_config_path() , 'WP Hide & Security Enhancer');
if ( count( $existing_data ) < 1 || count(array_diff($existing_data, $this->get_wp_config_data() )) > 0 )
{
if ( $update )
{
$this->clean_with_markers( $this->get_wp_config_path(), 'WP Hide & Security Enhancer' );
$args = array(
'marker' => 'WP Hide & Security Enhancer',
'insertion' => $this->get_wp_config_data(),
'before_marker' => "if ( ! defined( 'ABSPATH' ) ) {",
'before_offset' => 0,
'after_marker' => "<?php"
);
$status = $this->insert_with_markers( $this->get_wp_config_path(), $args );
return $status;
}
else
return FALSE;
}
return TRUE;
}
/**
* Return the data to put o wp-config.php file
*
*/
function get_wp_config_data()
{
$root_path = '/';
//Check if wp-config.php os actually one leve up relative to wordpress root directory
if ( realpath ( ABSPATH ) != realpath ( dirname( $this->get_wp_config_path() ) ) )
{
$subdirectory = str_replace( dirname( $this->get_wp_config_path() ), '' , realpath(ABSPATH . '/') );
$subdirectory = wp_normalize_path( $subdirectory );
$subdirectory = ltrim( $subdirectory, '/' );
$subdirectory = trailingslashit($subdirectory);
$root_path .= $subdirectory;
}
$data = array( "define('WPH_WPCONFIG_LOADER', TRUE);",
"include_once( ( defined('WP_PLUGIN_DIR') ? WP_PLUGIN_DIR . '/wp-hide-security-enhancer-pro/' : ( defined( 'WP_CONTENT_DIR') ? WP_CONTENT_DIR : dirname(__FILE__) . '" . $root_path . "' . 'wp-content' ) . '/plugins/wp-hide-security-enhancer-pro' ) . '/include/wph.class.php');",
'if (class_exists(\'WPH\')) { global $wph; $wph = new WPH(); ob_start( array($wph, \'ob_start_callback\')); }',
);
return $data;
}
function settings_changed_check_for_cache_plugins()
{
$active_plugins = (array) get_option( 'active_plugins', array() );
//cache plugin nottice
if(array_search('w3-total-cache/w3-total-cache.php', $active_plugins) !== FALSE)
{
//check if just flushed
if(!isset($_GET['w3tc_note']))
echo "<div class='error'><p>". __('W3 Total Cache Plugin is active, make sure you clear the cache for new changes to apply', 'wp-hide-security-enhancer') ."</p></div>";
}
if(array_search('wp-super-cache/wp-cache.php', $active_plugins) !== FALSE)
{
echo "<div class='error'><p>". __('WP Super Cache Plugin is active, make sure you clear the cache for new changes to apply', 'wp-hide-security-enhancer') ."</p></div>";
}
if(array_search('wp-fastest-cache/wpFastestCache.php', $active_plugins) !== FALSE)
{
echo "<div class='error'><p>". __('WP Fastest Cache Plugin is active, make sure you clear the cache for new changes to apply', 'wp-hide-security-enhancer') ."</p></div>";
}
}
/**
* Check if the site use a cache plugin with integration
*
* Shall be deprecated, when all buffers will move to late init
*
*/
function site_need_late_buffering()
{
if ( !function_exists( 'is_plugin_active' ) )
include_once( ABSPATH.'wp-admin/includes/plugin.php' );
$integrated = array (
'wp-rocket/wp-rocket.php',
//'swift-performance/performance.php',
'wp-fastest-cache/wpFastestCache.php'
);
foreach ( $integrated as $plugin )
{
if ( is_plugin_active( $plugin ) )
return TRUE;
}
return FALSE;
}
/**
* Return the module class by it's slug
*
* @param mixed $module_slug
*/
function get_module_by_slug($module_slug)
{
global $wph;
$found_module = FALSE;
foreach($wph->modules as $module)
{
$interface_menu_data = $module->get_module_slug();
if($interface_menu_data == $module_slug)
{
$found_module = $module;
break;
}
}
return $found_module;
}
/**
* Used on early access when WP_Rewrite is not available
*
*/
function is_permalink_enabled()
{
$permalink_structure = get_option('permalink_structure');
if ( empty($permalink_structure) )
return FALSE;
return TRUE;
}
/**
* Return the path to where WordPress index.php reside (WordPress loading point and .htaccess file location)
*
*/
function get_home_path()
{
$home = set_url_scheme( get_option( 'home' ), 'http' );
$siteurl = set_url_scheme( get_option( 'siteurl' ), 'http' );
if ( ! empty( $home ) && 0 !== strcasecmp( $home, $siteurl ) )
{
$home_path = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] );
$home_path = rtrim( $home_path , '/');
$home_path .= $this->wph->default_variables['site_relative_path'];
}
else
{
$home_path = ABSPATH;
}
$home_path = trim($home_path, '\\/ ');
//not for windows
if ( DIRECTORY_SEPARATOR != '\\')
$home_path = DIRECTORY_SEPARATOR . $home_path;
return $home_path;
}
/**
* Set server type
*
*/
function set_server_type()
{
//Allow to set server type through filter
if ( ! empty ( apply_filters( 'wph/core/set_server_type' , '' ) ) )
return;
$Server_SOFTWARE = $_SERVER['SERVER_SOFTWARE'];
If ( empty ( $Server_SOFTWARE ) )
{
//unable to identify server type
return FALSE;
}
//Check for Wpengine.. Unfortunate they require all rewrite (Nginx) to be sent to support and they will do the update
if ( $this->server_is_wpengine() )
{
$this->wph->server_nginx_config = TRUE;
return;
}
//check for Flywheel hosting
if ( stripos( $Server_SOFTWARE, 'Flywheel') !== FALSE )
{
$this->wph->server_nginx_config = TRUE;
return;
}
if ( $this->is_apache() === TRUE )
$this->wph->server_htaccess_config = TRUE;
if ( $this->is_IIS() === TRUE )
$this->wph->server_web_config = TRUE;
if ( $this->is_nginx() === TRUE )
$this->wph->server_nginx_config = TRUE;
}
/**
* Return if the server is WPEngine
*
*/
function server_is_wpengine()
{
if ( getenv('IS_WPE') == "1" || getenv('IS_WPE_SNAPSHOT') == "1" )
return TRUE;
return FALSE;
}
/**
* Return if the server is Kinsta
*
*/
function server_is_kinsta()
{
if ( getenv('KINSTA_CDN_DOMAIN') !== FALSE || getenv('KINSTA_CACHE_ZONE') !== FALSE )
return TRUE;
return FALSE;
}
/**
* return whatever server using the .htaccess config file
*
*/
function server_use_htaccess_config_file()
{
$home_path = $this->get_home_path();
$htaccess_file = $home_path . DIRECTORY_SEPARATOR . '.htaccess';
if ((!file_exists($htaccess_file) && is_writable($home_path) && $this->using_mod_rewrite_permalinks()) || is_writable($htaccess_file))
{
if ( $this->got_mod_rewrite() )
return TRUE;
}
return FALSE;
}
function using_mod_rewrite_permalinks()
{
return $this->is_permalink_enabled() && ! $this->using_index_permalinks();
}
function using_index_permalinks()
{
$permalink_structure = get_option('permalink_structure');
if(empty($permalink_structure))
return;
$index = 'index.php';
// If the index is not in the permalink, we're using mod_rewrite.
return preg_match( '#^/*' . $index . '#', $permalink_structure );
}
function got_mod_rewrite()
{
if ($this->apache_mod_loaded('mod_rewrite', true))
return TRUE;
return FALSE;
}
/**
* Does the specified module exist in the Apache config?
*
* @since 2.5.0
*
* @global bool $is_apache
*
* @param string $mod The module, e.g. mod_rewrite.
* @param bool $default Optional. The default return value if the module is not found. Default false.
* @return bool Whether the specified module is loaded.
*/
function apache_mod_loaded($mod, $default = false)
{
if ( !$this->is_apache() )
return false;
if ( function_exists( 'apache_get_modules' ) )
{
$mods = apache_get_modules();
if ( in_array($mod, $mods) )
return true;
}
elseif ( function_exists( 'phpinfo' ) && false === strpos( ini_get( 'disable_functions' ), 'phpinfo' ) ) {
ob_start();
phpinfo(8);
$phpinfo = ob_get_clean();
if ( false !== strpos($phpinfo, $mod) )
return true;
}
return $default;
}
/**
* return whatever the htaccess config file is writable
*
*/
function is_writable_htaccess_config_file()
{
$home_path = $this->get_home_path();
$htaccess_file = $home_path . DIRECTORY_SEPARATOR . '.htaccess';
if ((!file_exists($htaccess_file) && $this->is_permalink_enabled()) || is_writable($htaccess_file))
return TRUE;
return FALSE;
}
/**
* return whatever server using the .htaccess config file
*
*/
function server_use_web_config_file()
{
$is_iis7 = $this->is_IIS7();
$supports_permalinks = false;
if ( $is_iis7 )
{
$supports_permalinks = class_exists( 'DOMDocument', false ) && isset($_SERVER['IIS_UrlRewriteModule']) && ( PHP_SAPI == 'cgi-fcgi' );
}
$supports_permalinks = apply_filters( 'iis7_supports_permalinks', $supports_permalinks );
return $supports_permalinks;
}
/**
* return whatever the web.config config file is writable
*
*/
function is_writable_web_config_file()
{
$home_path = $this->get_home_path();
$web_config_file = $home_path . 'web.config';
if ( ( ! file_exists($web_config_file) && $this->is_permalink_enabled() ) || win_is_writable($web_config_file) )
return TRUE;
return FALSE;
}
/**
* Return if the server run Apache
*
*/
function is_apache()
{
$is_apache = FALSE;
$is_apache = (stripos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false || stripos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false);
return $is_apache;
}
/**
* Return if the server run on nginx
*
*/
function is_nginx()
{
$is_nginx = FALSE;
$is_nginx = (stripos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false);
return $is_nginx;
}
/**
* Return if the server run on IIS
*
*/
function is_IIS()
{
$is_IIS = FALSE;
$is_IIS = !$this->is_apache() && (stripos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false || stripos($_SERVER['SERVER_SOFTWARE'], 'ExpressionDevServer') !== false);
return $is_IIS;
}
/**
* Return if the server run on IIS version 7 and up
*
*/
function is_IIS7()
{
$is_iis7 = FALSE;
$is_iis7 = $this->is_IIS() && intval( substr( $_SERVER['SERVER_SOFTWARE'], stripos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/' ) + 14 ) ) >= 7;
return $is_iis7;
}
/**
* Return a write_check_string from server to ensure rewrite rules where applied
*
*/
function get_write_check_string_from_server()
{
$home_path = $this->get_home_path();
global $blog_id;
$result = FALSE;
//check for .htaccess
if ( $this->wph->server_htaccess_config === TRUE )
{
//use the SERVER data, as if the rewrite was set correctly it will return the rerite check number.
if ( isset ( $_SERVER['REDIRECT_WPH_REWRITE_1'] ) )
$result = $_SERVER['REDIRECT_WPH_REWRITE_1'];
else if ( isset ( $_SERVER['WPH_REWRITE_1'] ) )
$result = $_SERVER['WPH_REWRITE_1'];
else
$result = FALSE;
//Check if using specific hostings, which does not allow to set custom environment variables..
if ( $result === FALSE )
{
$file_path = $home_path . DIRECTORY_SEPARATOR . '.htaccess';
if( file_exists( $file_path ) )
{
if ( $markerdata = explode( "\n", implode( '', file( $file_path ) ) ));
{
foreach ( $markerdata as $markerline )
{
preg_match("/=WPH_REWRITE_1:([0-9a-z]+)\]/i", $markerline, $matches);
if(isset($matches[1]))
{
$result = $matches[1];
break;
}
}
}
}
}
}
//check for web.config
if ( $this->wph->server_web_config === TRUE )
{
$file_path = $home_path . DIRECTORY_SEPARATOR . 'web.config';
if(file_exists( $file_path ))
{
if ( $markerdata = explode( "\n", implode( '', file( $file_path ) ) ));
{
foreach ( $markerdata as $markerline )
{
preg_match("'<rule name=\"wph-rewrite-check.*?<!-- WPH_REWRITE_" . $blog_id . ":([0-9a-z]+) --></rule>'si", $markerline, $matches);
if(isset($matches[1]))
{
$result = $matches[1];
}
if (!isset($matches[1]) && strpos($markerline, '<!-- WriteCheckString-" . $blog_id . ":') !== false)
{
$result = trim(str_ireplace( '<!-- WriteCheckString-" . $blog_id . ":', '', $markerline));
$result = trim(str_replace( '-->', '', $result));
$result = trim($result);
}
}
}
}
}
return $result;
}
/**
* Return a status of custom rewrite rules, if being applied correctly
* Compare with latest write_check_string within the options and environment (saved to server rewrite file)
*
*/
function rewrite_rules_applied()
{
$applied_correctly = TRUE;
if ( $this->wph->server_nginx_config === TRUE )
return $applied_correctly;
if ( is_multisite() )
{
$settings = $this->get_site_settings ( 'network' );
return $applied_correctly;
}
$global_settings = $this->get_global_settings ( );
if ( $global_settings['self_setup'] == 'yes' )
return $applied_correctly;
global $blog_id;
$site_settings = $this->get_site_settings( $blog_id );
$write_check_string = isset ( $site_settings['write_check_string'] ) ? $site_settings['write_check_string'] : '';
if(!empty($write_check_string))
{
$existing_write_check_string = $this->get_write_check_string_from_server();
if(empty($existing_write_check_string) || $existing_write_check_string != $write_check_string)
$applied_correctly = FALSE;
}
return $applied_correctly;
}
/**
* Return rewrite base
*
*/
function get_rewrite_base( $saved_field_data, $left_slash = TRUE, $right_slash = TRUE, $append_path = '' )
{
global $blog_id;
$saved_field_data = $this->untrailingslashit_all($saved_field_data);
$path = '';
switch($append_path)
{
case 'site_path' :
$path = !empty($this->wph->default_variables['site_relative_path']) ? trailingslashit( $this->wph->default_variables['site_relative_path'] ) : '';
break;
case 'wp_path' :
$path .= !empty($this->wph->default_variables['wordpress_directory']) ? trailingslashit( $this->wph->default_variables['wordpress_directory'] ) : '';
break;
case 'full_path' :
$path = !empty($this->wph->default_variables['site_relative_path']) ? trailingslashit( $this->wph->default_variables['site_relative_path'] ) : '';
$path .= !empty($this->wph->default_variables['wordpress_directory']) ? trailingslashit( $this->wph->default_variables['wordpress_directory'] ) : '';
break;
}
if ( is_multisite() )
{
$ms_settings = $this->wph->functions->get_site_settings('network');
$use_blog_id = $blog_id;
$use_blog_id = 1;
$blog_details = get_blog_details( $use_blog_id );
$path .= trim($blog_details->path, '/') . '/';
}
//remove the site relative path if not empty
if ( ! empty ( $this->wph->default_variables['site_relative_path'] ) && ! empty ( trim( $this->wph->default_variables['site_relative_path'], '/' ) ) && ! empty ( trim( $path, '/') ) && strpos( trim( $path, '/'), trim( $this->wph->default_variables['site_relative_path'] , '/' ) ) === 0 )
{
$path = '#' . $path;
$path = str_replace( '#' . trim( $this->wph->default_variables['site_relative_path'] , '/' ) , '', $path );
$path = ltrim ( $path , '/' );
}
$rewrite_base = !empty($path) ? trailingslashit( $path ) . $saved_field_data : ( !empty($saved_field_data) ? '/' .$saved_field_data : '' );
if( !empty($rewrite_base))
{
$rewrite_base = $this->untrailingslashit_all( $rewrite_base );
if( $left_slash === TRUE )
$rewrite_base = '/' . $rewrite_base;
if( $right_slash === TRUE )
$rewrite_base = $rewrite_base . '/';
}
return $rewrite_base;
}
/**
* Return rewrite to base
*
*/
function get_rewrite_to_base( $field_data, $left_slash = TRUE, $right_slash = TRUE, $append_path = '')
{
$field_data = $this->untrailingslashit_all( $field_data );
$path = '';
switch($append_path)
{
case 'site_path' :
$path = !empty($this->wph->default_variables['site_relative_path']) ? trailingslashit( $this->wph->default_variables['site_relative_path'] ) : '';
break;
case 'wp_path' :
$path .= !empty($this->wph->default_variables['wordpress_directory']) ? trailingslashit( $this->wph->default_variables['wordpress_directory'] ) : '';
break;
case 'full_path' :
$path = !empty($this->wph->default_variables['site_relative_path']) ? trailingslashit( $this->wph->default_variables['site_relative_path'] ) : '';
$path .= !empty($this->wph->default_variables['wordpress_directory']) ? trailingslashit( $this->wph->default_variables['wordpress_directory'] ) : '';
break;
}
$rewrite_to_base = !empty($path) ? trailingslashit( $path ) . $field_data : ( !empty( $field_data ) ? '/' . $field_data : '' );
if( !empty($rewrite_to_base))
{
$rewrite_to_base = $this->untrailingslashit_all( $rewrite_to_base );
if( $left_slash === TRUE )
$rewrite_to_base = '/' . $rewrite_to_base;
if( $right_slash === TRUE )
$rewrite_to_base = $rewrite_to_base . '/';
}
return $rewrite_to_base;
}
/**
* Insert the data using markes in a specified file
*
* @param mixed $filename
* @param mixed $marker
* @param mixed $insertion
* @param mixed $before_marker
* @return mixed
*/
function insert_with_markers ( $filename, $args )
{
$defaults = array (
'marker' => '',
'insertion' => '',
'before_marker' => '',
'before_offset' => 0,
'after_marker' => ''
);
// Parse incoming $args into an array and merge it with $defaults
$args = wp_parse_args( $args, $defaults );
extract($args);
if ( ! file_exists( $filename ) ) {
if ( ! is_writable( dirname( $filename ) ) ) {
return false;
}
if ( ! touch( $filename ) ) {
return false;
}
} elseif ( ! is_writeable( $filename ) ) {
return false;
}
if ( ! is_array( $insertion ) ) {
$insertion = explode( "\n", $insertion );
}
$start_marker = "# BEGIN {$marker}";
$end_marker = "# END {$marker}";
$fp = fopen( $filename, 'r+' );
if ( ! $fp ) {
return false;
}
// Attempt to get a lock. If the filesystem supports locking, this will block until the lock is acquired.
flock( $fp, LOCK_EX );
$lines = array();
while ( ! feof( $fp ) ) {
$lines[] = rtrim( fgets( $fp ), "\r\n" );
}
// Split out the existing file into the preceding lines, and those that appear after the marker
$pre_lines = $post_lines = $existing_lines = array();
$found_marker = $found_end_marker = false;
foreach ( $lines as $line ) {
if ( ! $found_marker && false !== strpos( $line, $start_marker ) ) {
$found_marker = true;
continue;
} elseif ( ! $found_end_marker && false !== strpos( $line, $end_marker ) ) {
$found_end_marker = true;
continue;
}
if ( ! $found_marker ) {
$pre_lines[] = $line;
} elseif ( $found_marker && $found_end_marker ) {
$post_lines[] = $line;
} else {
$existing_lines[] = $line;
}
}
// Check to see if there was a change
if ( $existing_lines === $insertion ) {
flock( $fp, LOCK_UN );
fclose( $fp );
return true;
}
// Generate the new file data
if($found_marker && $found_end_marker)
{
$new_file_data = implode( "\n", array_merge(
$pre_lines,
array( $start_marker ),
$insertion,
array( $end_marker ),
$post_lines
) );
}
else
{
$insert_at = FALSE;
if ( ! empty ( $before_marker ) )
{
$insert_at = array_search($before_marker, array_map("trim", $pre_lines) );
}
if ( $insert_at === FALSE && ! empty ( $after_marker ) )
{
$insert_at = array_search($after_marker , array_map("trim", $pre_lines) );
$insert_at++;
}
if ( $insert_at === FALSE )
$insert_at = 0;
$pre_lines = array_merge(
array_slice( $pre_lines, 0, $insert_at, TRUE),
array( $start_marker ),
$insertion,
array( $end_marker ),
array_slice( $pre_lines, $insert_at, count($pre_lines), TRUE)
);
$new_file_data = implode( "\n", $pre_lines );
}
// Write to the start of the file, and truncate it to that length
fseek( $fp, 0 );
$bytes = fwrite( $fp, $new_file_data );
if ( $bytes ) {
ftruncate( $fp, ftell( $fp ) );
}
fflush( $fp );
flock( $fp, LOCK_UN );
fclose( $fp );
return (bool) $bytes;
}
function extract_from_markers( $filename, $marker )
{
$result = array ();
if ( ! file_exists( $filename ) )
{
return $result;
}
$markerdata = explode( "\n", implode( '', file( $filename ) ) );
$state = false;
foreach ( $markerdata as $markerline )
{
if ( false !== strpos( $markerline, '# END ' . $marker ) )
{
$state = false;
}
if ( $state )
{
$result[] = $markerline;
}
if ( false !== strpos( $markerline, '# BEGIN ' . $marker ) )
{
$state = true;
}
}
return $result;
}
static public function clean_with_markers( $filename, $marker)
{
if ( ! file_exists( $filename ) ) {
if ( ! is_writable( dirname( $filename ) ) ) {
return false;
}
if ( ! touch( $filename ) ) {
return false;
}
} elseif ( ! is_writeable( $filename ) ) {
return false;
}
$start_marker = "# BEGIN {$marker}";
$end_marker = "# END {$marker}";
$fp = fopen( $filename, 'r+' );
if ( ! $fp ) {
return false;
}
// Attempt to get a lock. If the filesystem supports locking, this will block until the lock is acquired.
flock( $fp, LOCK_EX );
$lines = array();
while ( ! feof( $fp ) ) {
$lines[] = rtrim( fgets( $fp ), "\r\n" );
}
// Split out the existing file into the preceding lines, and those that appear after the marker
$pre_lines = $post_lines = $existing_lines = array();
$found_marker = $found_end_marker = false;
foreach ( $lines as $line ) {
if ( ! $found_marker && false !== strpos( $line, $start_marker ) ) {
$found_marker = true;
continue;
} elseif ( ! $found_end_marker && false !== strpos( $line, $end_marker ) ) {
$found_end_marker = true;
continue;
}
if ( ! $found_marker ) {
$pre_lines[] = $line;
} elseif ( $found_marker && $found_end_marker ) {
$post_lines[] = $line;
} else {
$existing_lines[] = $line;
}
}
// Generate the new file data
if($found_marker && $found_end_marker)
{
$new_file_data = implode( "\n", array_merge(
$pre_lines,
$post_lines
) );
// Write to the start of the file, and truncate it to that length
fseek( $fp, 0 );
$bytes = fwrite( $fp, $new_file_data );
if ( $bytes ) {
ftruncate( $fp, ftell( $fp ) );
}
fflush( $fp );
flock( $fp, LOCK_UN );
fclose( $fp );
return (bool) $bytes;
}
return FALSE;
}
/**
* Left trim string from a list of array
*
*/
function ltrim_array( $string, $strip = array())
{
if ( ! is_array($strip) || count( $strip ) < 1 )
return $string;
foreach ( $strip as $strip_string )
{
if( 0 === strpos($string, $strip_string))
{
$string = substr($string, strlen($strip_string));
}
}
return $string;
}
/**
* Check if the plugin started through MU plugin loader
*
*/
function is_muloader()
{
if (defined('WPH_MULOADER'))
return TRUE;
return FALSE;
}
/**
*
* Check if theme is is customize mode
*
*/
function is_theme_customize()
{
if ( strpos($_SERVER['REQUEST_URI'] ,'customize.php') !== FALSE )
return TRUE;
if ( isset($_POST['wp_customize']) && sanitize_text_field($_POST['wp_customize']) == "on" )
return TRUE;
if ( isset($_GET['customize_theme']) )
return TRUE;
return FALSE;
}
/**
* Return Settings for specified / curren site
*
* @param mixed $blog_id_settings
* @param mixed $force_reload
*/
private function _get_settings( $blog_id_settings )
{
global $blog_id;
if ( is_multisite() && $blog_id_settings > 0 )
switch_to_blog( $blog_id_settings );
if ( $blog_id_settings == 'network')
{
$network_settings = get_site_option('wph_settings');
$defaults = array (
'module_settings' => array()
);
if ( is_multisite() && is_network_admin() )
{
$defaults = array (
'allow_every_site_to_change_options' => 'no'
);
}
$settings = wp_parse_args( $network_settings, $defaults );
}
else
{
$settings = get_option('wph_settings');
}
//ensure the settings are filled in with defaults if not exists in array
$_do_update_settings = FALSE;
if( !isset($settings['module_settings'] ) )
{
$settings['module_settings'] = array();
$_do_update_settings = TRUE;
}
//make sure all options exists within modules settings
foreach($this->wph->modules as $module)
{
$module_components = $this->filter_settings( $module->get_module_components_settings(), TRUE );
foreach($module_components as $module_component)
{
$default_value = $module_component['default_value'];
if(!isset( $settings['module_settings'][ $module_component['id'] ]))
{
$settings['module_settings'][ $module_component['id'] ] = $default_value;
$_do_update_settings = TRUE;
}
}
}
$settings = apply_filters('wp-hide/get_settings', $settings, $blog_id_settings);
if($_do_update_settings)
$this->update_site_settings( $settings, $blog_id_settings );
//hold the settings within main class for further usage
$this->wph->settings[ $blog_id_settings ] = $settings;
if ( is_multisite() && $blog_id_settings > 0 )
restore_current_blog();
return $settings;
}
/**
* Ensure settings include all loaded components
* This is being called after components where loaded
*
*/
function fill_settings()
{
global $blog_id;
unset ( $this->wph->settings[ $blog_id ] ) ;
$this->_get_settings( $blog_id );
}
/**
* Return current $blog_id settings
*
*/
function get_current_site_settings ( )
{
global $blog_id;
if ( is_multisite() && is_network_admin() && ! isset( $this->wph->settings['network'] ))
{
$settings = $this->_get_settings( 'network' );
}
else if ( is_multisite() && is_network_admin() && isset( $this->wph->settings['network'] ) )
{
$settings = $this->wph->settings['network'];
}
else if ( ! isset( $this->wph->settings[$blog_id] ) )
$settings = $this->_get_settings( $blog_id );
else
$settings = $this->wph->settings[$blog_id];
return $settings;
}
/**
* Return $blog_id settings
* Use stored settings data set instead self::get_settings()
*
*/
function get_site_settings ( $blog_id )
{
if ( ! isset( $this->wph->settings[$blog_id] ) )
$settings = $this->_get_settings( $blog_id );
else
$settings = $this->wph->settings[$blog_id];
return $settings;
}
/**
* Return th global settings which will be used across any sites
*
*/
function get_global_settings()
{
$settings = get_site_option('wph_global_settings');
$defaults = array (
'self_setup' => 'no',
'nginx_generate_simple_rewrite' => 'yes'
);
$settings = wp_parse_args( $settings, $defaults );
//if WPEngine force 'nginx_generate_simple_rewrite'
if ( $this->server_is_wpengine() || $this->server_is_kinsta() )
{
$settings['nginx_generate_simple_rewrite'] = 'yes';
}
$settings = apply_filters('wp-hide/get_global_settings', $settings);
return $settings;
}
/**
* Update global settings
*
*/
function update_global_settings( $settings )
{
update_site_option('wph_global_settings', $settings);
}
/**
* Return $blog_id settings to apply
* NOT TO BE USED FOR INTERFACE -> this output the latest options list
*
* This options list is corelated with saved rewrite rules
*/
function get_site_modules_settings_to_apply ( $blog_id )
{
if ( $blog_id == 'network' )
{
$wph_rewrite_manual_install = get_site_option('wph-rewrite-manual-install');
if ( empty ($wph_rewrite_manual_install) )
{
$settings = $this->get_site_modules_settings( $blog_id );
}
else
{
$settings = get_site_option('wph-previous-options-list');
}
}
else
{
$wph_rewrite_manual_install = get_option('wph-rewrite-manual-install');
if ( empty ($wph_rewrite_manual_install) )
{
$settings = $this->get_site_modules_settings( $blog_id );
}
else
{
//use previous saved setings
if ( is_multisite() )
switch_to_blog( $blog_id );
$wph_previous_options_list = get_option('wph-previous-options-list');
if ( ! is_array($wph_previous_options_list))
$wph_previous_options_list = array();
if ( is_multisite() )
restore_current_blog();
$settings = $wph_previous_options_list;
}
}
return $settings;
}
/**
* Return modules setings for current site
*
* @param mixed $blog_id
*/
function get_site_modules_settings( $blog_id_settings )
{
if ( isset( $this->wph->settings[ $blog_id_settings ] ) )
$settings = $this->wph->settings[ $blog_id_settings ];
else
$settings = $this->_get_settings( $blog_id_settings );
$modules_settings = $settings['module_settings'];
return $modules_settings;
}
/**
* Return a Module Item value setting
*
* If $context is 'display' then it returns the current saved value
*
* @param mixed $item_id
*/
function get_site_module_saved_value( $option_id, $blog_id_settings = '', $context = '' )
{
if ( empty( $blog_id_settings ) )
{
global $blog_id;
$blog_id_settings = $blog_id;
}
if ( $context == 'display' )
$modules_settings = $this->get_site_modules_settings( $blog_id_settings );
else
$modules_settings = $this->get_site_modules_settings_to_apply( $blog_id_settings );
$value = isset($modules_settings[ $option_id ]) ? $modules_settings[ $option_id] : '';
$value = apply_filters( 'wp-hide/get_site_module_saved_value', $value, $option_id );
return $value;
}
/**
* Update the settings for the given $blog_id
*
* @param mixed $settings
* @param mixed $blog_id_settings
* @param mixed $update_class_settings
*/
function update_site_settings( $settings, $blog_id_settings, $update_class_settings = TRUE )
{
if ( $blog_id_settings == 'network' )
{
update_site_option('wph_settings', $settings);
}
else
{
if ( is_multisite() )
switch_to_blog( $blog_id_settings );
update_option('wph_settings', $settings);
if ( is_multisite() )
restore_current_blog();
}
if ( $update_class_settings === TRUE )
$this->wph->settings[ $blog_id_settings ] = $settings;
}
/**
* Update the modules settings for current blog_id
*
* @param mixed $modules_settings
*/
function update_site_modules_settings( $modules_settings, $blog_id_settings, $update_class_settings = TRUE )
{
$settings = $this->wph->settings[ $blog_id_settings ];
$settings['module_settings'] = $modules_settings;
$this->update_site_settings( $settings, $blog_id_settings );
if ( $update_class_settings === TRUE )
$this->wph->settings[ $blog_id_settings ] = $settings;
}
/**
* return a hash of current site settings
*
*/
function get_current_site_settings_hash()
{
$settings = $this->get_current_site_settings ();
//return md5 ( json_encode( $settings['module_settings'] ) );
return hash( 'crc32', json_encode( $settings['module_settings'] ), FALSE );
}
/**
* Return the blog id or network if superadmin dashboard
*
*/
function get_blog_id()
{
global $blog_id;
$blog_id_settings = '';
if ( is_multisite() )
$blog_id_settings = 'network';
else
$blog_id_settings = $blog_id;
return $blog_id_settings;
}
/**
* Return the blog_id or network as blog_id, to be used to retrieve the settings.
* This always return $blog_id when Single Site
*
* If MultiSite and 'allow_every_site_to_change_options' is NO it return 'network' which held the settings to be used across all sites
*
*/
function get_blog_id_setting_to_use()
{
global $blog_id;
if(is_multisite() )
{
return 'network';
}
else
return $blog_id;
}
/**
* Get path from url relative to domain root
*
* @param mixed $url
* @param mixed $is_file_path
* @param mixed $relative_to_wordpress_directory
*/
function get_url_path($url, $is_file_path = FALSE, $relative_to_wordpress_directory = FALSE)
{
if(!$is_file_path)
$url = trailingslashit( $url );
$url_parse = parse_url( $url );
$path = $url_parse['path'];
if( $relative_to_wordpress_directory === TRUE && $this->wph->default_variables['wordpress_directory'] != '/')
{
$path = $this->string_left_replacement( $path , trailingslashit ( $this->wph->default_variables['wordpress_directory'] )) ;
}
if(!$is_file_path)
$path = trailingslashit( $path );
if($path != '/' && strlen($path) > 1)
{
$path = ltrim($path, '/');
$path = '/' . $path;
}
if(isset($url_parse['query']))
$path .= '?' . $url_parse['query'];
$path = str_replace( '\\', '/', $path);
return $path;
}
/**
* return the url relative to domain root
*
* @param mixed $url
*/
function get_url_path_relative_to_domain_root($url)
{
$url = str_replace(trailingslashit( home_url() ), "" , $url);
return $url;
}
/**
* Replace all slashes from begining and the end of string
*
* @param mixed $value
*/
function untrailingslashit_all($value)
{
$value = ltrim(rtrim($value, "/"), "/");
return $value;
}
/**
* Replace a prefix from the beginning of a text
*
* @param mixed $string
* @param mixed $prefix
*/
function string_left_replacement($string, $prefix)
{
if (substr($string, 0, strlen($prefix)) == $prefix)
{
$string = (string) substr($string, strlen($prefix));
}
return $string;
}
/**
* saniteize including a possible extension
*
* @param mixed $value
*/
function sanitize_file_path_name($value)
{
$value = trim($value);
if(empty($value))
return $value;
//check for any extension
$pathinfo = pathinfo($value);
$dirname = (!empty($pathinfo['dirname']) && $pathinfo['dirname'] != '.') ? $pathinfo['dirname'] : '';
$path = !empty($dirname) ? trailingslashit($dirname) . $pathinfo['filename'] : $pathinfo['filename'];
$parts = explode("/", $path);
$parts = array_filter($parts);
foreach($parts as $key => $part_item)
{
$parts[$key] = sanitize_title($part_item);
}
$value = implode("/", $parts);
$value .= !empty($pathinfo['extension']) ? '.' . $pathinfo['extension'] : '';
$value = strtolower($value);
return $value;
}
/**
* make sure there's a php extension included within the slug
*
* @param mixed $value
* @return mixed
*/
function extension_required($value, $extension)
{
$value = trim($value);
if($value == '')
return '';
$file_extension = substr($value, -4);
if(strtolower( $file_extension ) != '.' . $extension )
$value .= '.' . $extension;
return $value;
}
/**
* Return current url
*
*/
function get_current_url()
{
$current_url = 'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
return $current_url;
}
/**
* Add replacement withint the list
*
* @param mixed $old_url
* @param mixed $new_url
*/
function add_replacement($old_url, $new_url, $priority = 'normal')
{
if($this->replacement_exists($old_url))
return;
$this->wph->urls_replacement[ $priority ][ $old_url ] = $new_url;
}
/**
* Return whatever a replacement exists or not
* The old url should be provided
*
* @param mixed $old_url
*/
function replacement_exists($old_url)
{
if(count($this->wph->urls_replacement) < 1)
return FALSE;
foreach($this->wph->urls_replacement as $priority => $replacements_block)
{
if(isset($this->wph->urls_replacement[$priority][ $old_url ]))
return TRUE;
}
return FALSE;
}
/**
* Return a list of replacements
*
*/
function get_replacement_list()
{
$replacements = array();
if(count($this->wph->urls_replacement) < 1)
return $replacements;
foreach($this->wph->urls_replacement as $priority => $replacements_block)
{
if(!is_array($replacements_block) || count($replacements_block) < 1)
continue;
foreach($replacements_block as $old_url => $new_url)
{
$replacements[ $old_url ] = $new_url;
}
}
return $replacements;
}
/**
* Add a preserved link
*
* @param mixed $preserve_slug
* @param mixed $new_url
*/
function add_preserved_url($preserve_slug, $new_url)
{
$this->wph->url_preserve[ $preserve_slug ] = $new_url;
}
/**
* Return the prserved links
*
* @param mixed $preserve_slug
* @param mixed $new_url
*/
function get_preserved_list()
{
return $this->wph->url_preserve;
}
/**
* Preserve Texts between <!-- WPH Preserve - Start --> and <!-- WPH Preserve - Stop -->
*
*/
function text_preserve( $buffer )
{
preg_match_all("'<!-- WPH Preserve - Start -->(.*?)<!-- WPH Preserve - Stop -->'si", $buffer, $matches);
if ( $matches === FALSE )
return $buffer;
foreach ( $matches[1] as $key => $match )
{
$hash = '%WPH-PLACEHOLDER-PRESERVE-' . md5($match);
$this->wph->text_preserve[ $hash ] = $match;
$buffer = str_ireplace($matches[0][$key], $hash, $buffer);
}
return $buffer;
}
/**
* Restore any preserved texts
*
* @param mixed $buffer
*/
function text_preserve_restore( $buffer )
{
if ( count ( $this->wph->text_preserve ) < 1 )
return $buffer;
foreach ( $this->wph->text_preserve as $hash => $text )
{
$buffer = str_ireplace($hash, $text, $buffer);
}
return $buffer;
}
/**
* Replace the urls within given content
*
* @param mixed $text
* @param mixed $replacements
*/
function content_urls_replacement( $text, $replacements )
{
//process the replacements
if( count($replacements) < 1)
return $text;
if ( is_object( $text ) )
return $text;
//exclude scheme to match urls without it
$_replacements = array();
//no protocol
$_replacements_np = array();
//single quote ; double quote
$_relative_url_replacements_sq = array();
$_relative_url_replacements_dq = array();
//single quote ; double quote / domain url / domain ssl
$_relative_domain_url_replacements_sq = array();
$_relative_domain_url_replacements_dq = array();
//$_relative_domain_url_replacements_ssl_sq = array();
//$_relative_domain_url_replacements_ssl_dq = array();
$home_url = home_url();
$home_url_parsed = parse_url($home_url);
$domain_url = 'http://' . $home_url_parsed['host'];
$domain_url_ssl = 'https://' . $home_url_parsed['host'];
/**
*
* CDN
*
*/
$global_settings = $this->get_global_settings ( );
$CDN_urls = (array)$this->get_site_module_saved_value('cdn_url', $this->get_blog_id_setting_to_use());
$CDN_urls = array_filter( array_map("trim", $CDN_urls) ) ;
if ( count( $CDN_urls ) > 0 )
{
foreach($replacements as $old_url => $new_url)
{
foreach ( $CDN_urls as $CDN_url )
{
$replacements[ str_replace($home_url_parsed['host'], $CDN_url, $old_url) ] = str_replace($home_url_parsed['host'], $CDN_url, $new_url);
}
}
}
/**
* Preserve absolute paths
*
*/
$text = str_ireplace( ABSPATH, '%WPH-PLACEHOLDER-PRESERVE-ABSPATH%', $text);
//jsonencoded
$text = str_ireplace( trim(json_encode(ABSPATH), '"'), '%WPH-PLACEHOLDER-PRESERVE-JSON-ABSPATH%', $text);
//urlencode
$text = str_ireplace( trim(urlencode(ABSPATH), '"'), '%WPH-PLACEHOLDER-PRESERVE-URLENCODE-ABSPATH%', $text);
foreach($replacements as $old_url => $new_url)
{
//add quote to make sure it's actualy a link value and is right at the start of text
$_relative_url_replacements_dq[ '"' . str_ireplace( $home_url, "", $old_url) ] = '"' . str_ireplace( $home_url, "", $new_url);
$_relative_url_replacements_sq[ "'" . str_ireplace( $home_url, "", $old_url) ] = "'" . str_ireplace( $home_url, "", $new_url);
$_relative_domain_url_replacements_dq[ '"' . str_ireplace( array( $domain_url, $domain_url_ssl ), "", $old_url) ] = '"' . str_ireplace( array( $domain_url, $domain_url_ssl ), "", $new_url);
$_relative_domain_url_replacements_sq[ "'" . str_ireplace( array( $domain_url, $domain_url_ssl ), "", $old_url) ] = "'" . str_ireplace( array( $domain_url, $domain_url_ssl ), "", $new_url);
//match urls without protocol
$_old_url = str_ireplace( array('http:', 'https:'), "", $old_url);
$_new_url = str_ireplace( array('http:', 'https:'), "", $new_url);
$_replacements_np[$_old_url] = $_new_url;
$_old_url = str_ireplace( array('http://', 'https://'), "", $old_url);
$_new_url = str_ireplace( array('http://', 'https://'), "", $new_url);
$_replacements[$_old_url] = $_new_url;
}
/**
* Main replaments
*
* @var mixed
*/
$text = str_ireplace( array_keys($_replacements_np), array_values($_replacements_np) ,$text );
/**
* Relative tp domain urls replacements; using subfolder e.g. 127.0.0.1/wp01/wordpress_site, this will be /wp01/wordpress_site
*
* @var mixed
*/
$text = str_ireplace( array_keys($_relative_domain_url_replacements_sq), array_values($_relative_domain_url_replacements_sq) ,$text );
$text = str_ireplace( array_keys($_relative_domain_url_replacements_dq), array_values($_relative_domain_url_replacements_dq) ,$text );
/**
* Relative urls replacements
* @var mixed
*/
//single quote
$text = str_ireplace( array_keys($_relative_url_replacements_sq), array_values($_relative_url_replacements_sq) ,$text );
$text = str_ireplace( array_keys($_relative_url_replacements_dq), array_values($_relative_url_replacements_dq) ,$text );
$home_url_protocol_strip = str_ireplace( array('http://', 'https://'), "", $home_url);
/**
* Check for json encoded urls
* Format domain/old-slug => domain/ne-slug
*
* Some might not include the domain to ensure repalcing in specific instances e.g admin url, ajax url
*/
foreach($_replacements as $old_url => $new_url)
{
//JSON some might not using the end forward slash
//add ending double quote to ensure end of url, to avoid replacing parts of the data
if ( rtrim( $old_url , '/' ) != $old_url )
{
$text = str_ireplace( trim( json_encode( rtrim( trim( $old_url, '"'), '/') ), '"' ) . '"' , trim( json_encode( rtrim( trim ( $new_url, '"'), '/' ) ), '"' ) . '"' ,$text );
}
//URL ENCODED
$_old_url = trim(urlencode($old_url), '"');
$_new_url = trim(urlencode($new_url), '"');
$text = str_ireplace( $_old_url, $_new_url ,$text );
$old_url = trim(json_encode($old_url), '"');
$new_url = trim(json_encode($new_url), '"');
$text = str_ireplace( $old_url, $new_url ,$text );
$old_url = trim(urlencode($old_url), '"');
$new_url = trim(urlencode($new_url), '"');
$text = str_ireplace( $old_url, $new_url ,$text );
}
foreach($_relative_domain_url_replacements_dq as $old_url => $new_url)
{
/*
* JSON always use double quotes
* use double quote type at the start of the string (per json encodync) to avoid replacing for non-local domains
* e.g. "collectionThumbnail":"https:\/\/wp.envatoextensions.com\/kit-57\/wp-content\/uploads\/sites\/60\/2018\/08\/screenshot-20-1540279812-300x997.jpg"
*/
//$text = str_ireplace( "'" . trim( json_encode( trim( $old_url, '"')), '"' ) , "'" . trim( json_encode( trim ( $new_url, '"')), '"' ) ,$text );
$text = str_ireplace( '"' . trim( json_encode( trim( $old_url, '"')), '"' ) , '"' . trim( json_encode( trim ( $new_url, '"')), '"' ) ,$text );
//$text = str_ireplace( "'" . trim( urlencode(trim( $old_url, '"')), '"' ) , "'" . trim( urlencode(trim ( $new_url, '"')), '"' ) ,$text );
$text = str_ireplace( '"' . trim( urlencode(trim( $old_url, '"')), '"' ) , '"' . trim( urlencode(trim ( $new_url, '"')), '"' ) ,$text );
}
$text = apply_filters( 'wp-hide/content_urls_replacement', $text, $_replacements );
/**
* Restore absolute paths
*/
//Preserve absolute paths
$text = str_ireplace( '%WPH-PLACEHOLDER-PRESERVE-ABSPATH%', ABSPATH, $text);
//jsonencoded
$text = str_ireplace( '%WPH-PLACEHOLDER-PRESERVE-JSON-ABSPATH%', trim(json_encode(ABSPATH), '"'), $text);
//urlencode
$text = str_ireplace( '%WPH-PLACEHOLDER-PRESERVE-URLENCODE-ABSPATH%', trim(urlencode(ABSPATH), '"'), $text);
return $text;
}
/**
* Replace preserved links
*
* @param mixed $text
* @param mixed $replacements
*/
function content_preserved_urls_replacement( $text, $replacements )
{
$text = str_ireplace( array_keys($replacements), array_values($replacements) ,$text );
return $text;
}
function default_scripts_styles_replace($object, $replacements)
{
//update default dirs
if(isset($object->default_dirs))
{
foreach($object->default_dirs as $key => $value)
{
$object->default_dirs[$key] = str_replace(array_keys($replacements), array_values($replacements), $value);
}
}
foreach($object->registered as $script_name => $script_data)
{
$script_data->src = str_replace(array_keys($replacements), array_values($replacements), $script_data->src);
$object->registered[$script_name] = $script_data;
}
return $object;
}
function check_headers_content_type($header_name, $header_value)
{
$headers = headers_list();
foreach($headers as $header)
{
if(stripos($header, $header_name) !== FALSE)
{
if(stripos($header, $header_value) !== FALSE)
return TRUE;
}
}
return FALSE;
}
function array_sort_by_processing_order($a, $b)
{
return $a['processing_order'] - $b['processing_order'];
}
/**
* Return the recovey code
*
*/
function get_recovery_code()
{
$blog_id_settings = $this->get_blog_id();
$settings = $this->get_site_settings( $blog_id_settings );
$recovery_code = isset ( $settings['recovery_code'] ) ? $settings['recovery_code'] : '';
if(empty($recovery_code))
{
$recovery_code = $this->generate_recovery_code();
$settings['recovery_code'] = $recovery_code;
$this->update_site_settings( $settings, $blog_id_settings );
}
return $recovery_code;
}
/**
* Generate a recovery code
*
*/
function generate_recovery_code()
{
$recovery_code = md5(rand(1,9999) . microtime());
return $recovery_code;
}
/**
* Trigger the recovery actions
*
*/
function do_recovery()
{
//feetch a new set of settings
$recovery_code = $this->get_recovery_code();
$wph_recovery = isset($_GET['wph-recovery']) ? sanitize_text_field($_GET['wph-recovery']) : '';
if(empty($wph_recovery) || $wph_recovery != $recovery_code)
return;
$blog_id_settings = $this->get_blog_id();
$settings = $this->get_site_settings( $blog_id_settings );
$modules_settings = array();
foreach($this->wph->modules as $module)
{
//proces the fields
$module_settings = $this->filter_settings( $module->get_module_components_settings(), TRUE );
foreach($module_settings as $module_setting)
{
if(isset($module_setting['type']) && $module_setting['type'] == 'split')
continue;
$field_name = $module_setting['id'];
$value = isset($module_setting['default_value']) ? $module_setting['default_value'] : '';
//save the value
$modules_settings[ $field_name ] = $value;
}
}
$settings['module_settings'] = $modules_settings;
//update the settings
$this->update_site_settings( $settings, $blog_id_settings );
$global_settings = $this->get_global_settings ( );
$global_settings['self_setup'] = 'no';
$this->update_global_settings( $global_settings );
//available for mu-plugins
do_action( 'wph/do_recovery' );
//add filter for rewriting the rules
add_action('wp_loaded', array($this, 'wp_loaded_trigger_do_recovery'));
}
function wp_loaded_trigger_do_recovery()
{
/** WordPress Misc Administration API */
require_once(ABSPATH . 'wp-admin/includes/misc.php');
/** WordPress Administration File API */
require_once(ABSPATH . 'wp-admin/includes/file.php');
flush_rewrite_rules();
?><!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width">
<meta name='robots' content='noindex,follow' />
<title>WP-Hide - Recovery</title>
<style type="text/css">
html{background:#f1f1f1}body{background:#fff;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:2em auto;padding:1em 2em;max-width:700px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.13);box-shadow:0 1px 3px rgba(0,0,0,.13)}h1{border-bottom:1px solid #dadada;clear:both;color:#666;font-size:24px;margin:30px 0 0 0;padding:0;padding-bottom:7px}#error-page{margin-top:50px}#error-page .wp-die-message,#error-page p{font-size:14px;line-height:1.5;margin:25px 0 20px}#error-page code{font-family:Consolas,Monaco,monospace}ul li{margin-bottom:10px;font-size:14px}a{color:#0073aa}a:active,a:hover{color:#006799}a:focus{color:#124964;-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:0}.button{background:#f7f7f7;border:1px solid #ccc;color:#555;display:inline-block;text-decoration:none;font-size:13px;line-height:2;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;-webkit-border-radius:3px;-webkit-appearance:none;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc;vertical-align:top}.button.button-large{height:30px;line-height:2.15384615;padding:0 12px 2px}.button:focus,.button:hover{background:#fafafa;border-color:#999;color:#23282d}.button:focus{border-color:#5b9dd9;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8);outline:0}.button:active{background:#eee;border-color:#999;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}
</style>
</head>
<body>
<h1>WP-Hide - <?php _e('Recovery', 'wp-hide-security-enhancer') ?></h1>
<p><b><?php _e('The plugin options have been reset successfully.', 'wp-hide-security-enhancer') ?></b></p>
<br />
<?php
if ( $this->wph->server_htaccess_config === TRUE )
{
?>
<p><?php _e('Ensure the .htaccess file does not contain any WP-Hide rewrite lines. The plugin already attempts to clear the lines, if the operation fails, they are required to be removed manually. ', 'wp-hide-security-enhancer') ?></p>
<?php
}
if ( $this->wph->server_web_config === TRUE )
{
?>
<p><?php _e('Ensure the web.config file does not contain any WP-Hide rewrite lines. The plugin already attempts to clear the lines, if the operation fails, they are required to be removed manually. ', 'wp-hide-security-enhancer') ?></p>
<?php
}
if ( $this->wph->server_nginx_config === TRUE )
{
//Check if use Wpengine
if ( $this->wph->functions->server_is_wpengine() )
{
?>
<p><?php _e('Your site use WPEngine! You need to get in touch with live support and ask to remove the custom Nginx rewrite code from your account.', 'wp-hide-security-enhancer') ?></p>
<?php
}
else if ( $this->wph->functions->server_is_kinsta() )
{
?>
<p><?php _e('Your site use Kinsta! You need to get in touch with live support and ask to remove the custom Nginx rewrite code from your account.', 'wp-hide-security-enhancer') ?></p>
<?php
}
else
{
?>
<p><?php _e('Check with your Nginx config file located usually at', 'wp-hide-security-enhancer') ?> /etc/nginx/sites-available/ <?php _e('and remove any existing rewrite rules within', 'wp-hide-security-enhancer') ?> <strong># BEGIN WP Hide & Security Enhancer</strong> <?php _e('and', 'wp-hide-security-enhancer') ?> <strong># END WP Hide & Security Enhancer</strong></p>
<p><?php _e('After config file updated', 'wp-hide-security-enhancer') ?>, <strong><?php _e('Test', 'wp-hide-security-enhancer') ?></strong> <?php _e('the new data using ', 'wp-hide-security-enhancer') ?> <strong>nginx -t</strong>. <?php _e('If successfully compiled, restart the Nginx service.', 'wp-hide-security-enhancer') ?></p>
<?php
}
}
?>
<p><br /></p>
<p><a class="button" href="<?php echo get_site_url() ?>"><?php _e('Continue to your Site', 'wp-hide-security-enhancer') ?></a></p>
</body>
</html>
<?php
$this->rewrite_applied_correctly_to_site();
wp_logout();
die();
}
/**
* Check if filter / action exists for anonymous object
*
* @param mixed $tag
* @param mixed $class
* @param mixed $method
*/
function anonymous_object_filter_exists($tag, $class, $method)
{
if ( ! isset( $GLOBALS['wp_filter'][$tag] ) )
return FALSE;
$filters = $GLOBALS['wp_filter'][$tag];
if ( ! $filters )
return FALSE;
foreach ( $filters as $priority => $filter )
{
foreach ( $filter as $identifier => $function )
{
if ( ! is_array( $function ) )
continue;
if ( ! $function['function'][0] instanceof $class )
continue;
if ( $method == $function['function'][1] )
{
return TRUE;
}
}
}
return FALSE;
}
/**
* Replace a filter / action from anonymous object
*
* @param mixed $tag
* @param mixed $class
* @param mixed $method
*/
function remove_anonymous_object_filter( $tag, $class, $method )
{
$filters = false;
if ( isset( $GLOBALS['wp_filter'][$tag] ) )
$filters = $GLOBALS['wp_filter'][$tag];
if ( $filters )
foreach ( $filters as $priority => $filter )
{
foreach ( $filter as $identifier => $function )
{
if ( ! is_array( $function ) )
continue;
if ( ! $function['function'][0] instanceof $class )
continue;
if ( $method == $function['function'][1] )
{
remove_filter($tag, array( $function['function'][0], $method ), $priority);
}
}
}
}
/**
* Check the plugins directory and retrieve all plugin files with plugin data.
*
* WordPress only supports plugin files in the base plugins directory
* (wp-content/plugins) and in one directory above the plugins directory
* (wp-content/plugins/my-plugin). The file it looks for has the plugin data
* and must be found in those two locations. It is recommended to keep your
* plugin files in their own directories.
*
* The file with the plugin data is the file that will be included and therefore
* needs to have the main execution for the plugin. This does not mean
* everything must be contained in the file and it is recommended that the file
* be split for maintainability. Keep everything in one file for extreme
* optimization purposes.
*
* @since 1.5.0
*
* @param string $plugin_folder Optional. Relative path to single plugin folder.
* @return array Key is the plugin file path and the value is an array of the plugin data.
*/
function get_plugins($plugin_folder = '')
{
$wp_plugins = array ();
$plugin_root = WP_PLUGIN_DIR;
if ( !empty($plugin_folder) )
$plugin_root .= $plugin_folder;
// Files in wp-content/plugins directory
$plugins_dir = @ opendir( $plugin_root);
$plugin_files = array();
if ( $plugins_dir ) {
while (($file = readdir( $plugins_dir ) ) !== false ) {
if ( substr($file, 0, 1) == '.' )
continue;
if ( is_dir( $plugin_root.'/'.$file ) ) {
$plugins_subdir = @ opendir( $plugin_root.'/'.$file );
if ( $plugins_subdir ) {
while (($subfile = readdir( $plugins_subdir ) ) !== false ) {
if ( substr($subfile, 0, 1) == '.' )
continue;
if ( substr($subfile, -4) == '.php' )
$plugin_files[] = "$file/$subfile";
}
closedir( $plugins_subdir );
}
} else {
if ( substr($file, -4) == '.php' )
$plugin_files[] = $file;
}
}
closedir( $plugins_dir );
}
if ( empty($plugin_files) )
return $wp_plugins;
foreach ( $plugin_files as $plugin_file ) {
if ( !is_readable( "$plugin_root/$plugin_file" ) )
continue;
$plugin_data = $this->get_plugin_data( "$plugin_root/$plugin_file", false, false ); //Do not apply markup/translate as it'll be cached.
if ( empty ( $plugin_data['Name'] ) )
continue;
$wp_plugins[plugin_basename( $plugin_file )] = $plugin_data;
}
uasort( $wp_plugins, array($this, '_sort_uname_callback' ));
return $wp_plugins;
}
/**
* Callback to sort array by a 'Name' key.
*
*/
function _sort_uname_callback( $a, $b )
{
return strnatcasecmp( $a['Name'], $b['Name'] );
}
/**
* Parse plugin headers data
*
* @param mixed $plugin_file
* @param mixed $markup
* @param mixed $translate
*/
function get_plugin_data( $plugin_file, $markup = true, $translate = true )
{
$default_headers = array(
'Name' => 'Plugin Name',
'PluginURI' => 'Plugin URI',
'Version' => 'Version',
'Description' => 'Description',
'Author' => 'Author',
'AuthorURI' => 'Author URI',
'TextDomain' => 'Text Domain',
'DomainPath' => 'Domain Path',
'Network' => 'Network',
// Site Wide Only is deprecated in favor of Network.
'_sitewide' => 'Site Wide Only',
);
$plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' );
// Site Wide Only is the old header for Network
if ( ! $plugin_data['Network'] && $plugin_data['_sitewide'] ) {
/* translators: 1: Site Wide Only: true, 2: Network: true */
_deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The %1$s plugin header is deprecated. Use %2$s instead.' ), '<code>Site Wide Only: true</code>', '<code>Network: true</code>' ) );
$plugin_data['Network'] = $plugin_data['_sitewide'];
}
$plugin_data['Network'] = ( 'true' == strtolower( $plugin_data['Network'] ) );
unset( $plugin_data['_sitewide'] );
if ( $markup || $translate ) {
$plugin_data = $this->_get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate );
} else {
$plugin_data['Title'] = $plugin_data['Name'];
$plugin_data['AuthorName'] = $plugin_data['Author'];
}
return $plugin_data;
}
/**
* Sanitizes plugin data, optionally adds markup, optionally translates.
*
* @since 2.7.0
* @access private
* @see get_plugin_data()
*/
function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true )
{
// Sanitize the plugin filename to a WP_PLUGIN_DIR relative path
$plugin_file = plugin_basename( $plugin_file );
// Translate fields
if ( $translate ) {
if ( $textdomain = $plugin_data['TextDomain'] ) {
if ( ! is_textdomain_loaded( $textdomain ) ) {
if ( $plugin_data['DomainPath'] ) {
load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] );
} else {
load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) );
}
}
} elseif ( 'hello.php' == basename( $plugin_file ) ) {
$textdomain = 'default';
}
if ( $textdomain ) {
foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field )
$plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain );
}
}
// Sanitize fields
$allowed_tags = $allowed_tags_in_links = array(
'abbr' => array( 'title' => true ),
'acronym' => array( 'title' => true ),
'code' => true,
'em' => true,
'strong' => true,
);
$allowed_tags['a'] = array( 'href' => true, 'title' => true );
// Name is marked up inside <a> tags. Don't allow these.
// Author is too, but some plugins have used <a> here (omitting Author URI).
$plugin_data['Name'] = wp_kses( $plugin_data['Name'], $allowed_tags_in_links );
$plugin_data['Author'] = wp_kses( $plugin_data['Author'], $allowed_tags );
$plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags );
$plugin_data['Version'] = wp_kses( $plugin_data['Version'], $allowed_tags );
$plugin_data['PluginURI'] = esc_url( $plugin_data['PluginURI'] );
$plugin_data['AuthorURI'] = esc_url( $plugin_data['AuthorURI'] );
$plugin_data['Title'] = $plugin_data['Name'];
$plugin_data['AuthorName'] = $plugin_data['Author'];
// Apply markup
if ( $markup ) {
if ( $plugin_data['PluginURI'] && $plugin_data['Name'] )
$plugin_data['Title'] = '<a href="' . $plugin_data['PluginURI'] . '">' . $plugin_data['Name'] . '</a>';
if ( $plugin_data['AuthorURI'] && $plugin_data['Author'] )
$plugin_data['Author'] = '<a href="' . $plugin_data['AuthorURI'] . '">' . $plugin_data['Author'] . '</a>';
$plugin_data['Description'] = wptexturize( $plugin_data['Description'] );
if ( $plugin_data['Author'] )
$plugin_data['Description'] .= ' <cite>' . sprintf( __('By %s.'), $plugin_data['Author'] ) . '</cite>';
}
return $plugin_data;
}
/**
* Alternative when apache_response_headers() not available
*
*/
function parseRequestHeaders()
{
$headers = array();
foreach($_SERVER as $key => $value)
{
if (substr($key, 0, 5) <> 'HTTP_')
continue;
$header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
$headers[$header] = $value;
}
return $headers;
}
/**
* Attempt to update the outputed headers
*
* @param mixed $headers
* @param mixed $response_headers
*/
function update_headers( $headers, $response_headers )
{
$replacement_list = $this->get_replacement_list();
foreach ( $headers as $header )
{
if(isset($response_headers[ $header ]))
{
$header_value = $response_headers[ $header ];
$new_header_value = $this->content_urls_replacement($header_value, $replacement_list );
if($header_value != $new_header_value)
{
header_remove("Location");
header( 'Location: ' . $new_header_value );
}
}
}
}
/**
* Check if current content is filterable, depending on header content type
*
*/
function is_filterable_content_type()
{
$is_filterable = TRUE;
$headers_content_type = $this->get_headers_list_content_type();
if ( $headers_content_type === FALSE )
return $is_filterable;
$allow_type = array(
'text/plain',
'text/css',
'text/html',
'text/csv',
'application/javascript',
'text/javascript',
'application/json'
);
if ( ! in_array( $headers_content_type , $allow_type ) )
$is_filterable = FALSE;
return $is_filterable;
}
function get_headers_list_content_type()
{
$headers = headers_list();
//there is no header to check
if ( ! is_array( $headers ) || count ( $headers ) < 1 )
return FALSE;
$found = preg_grep('/^Content-Type\s?:.*/i', $headers);
if ( ! is_array ( $found ) || count ( $found ) < 1 )
return FALSE;
reset( $found );
$header_field = $headers[ key( $found ) ];
$header_field = preg_replace('/Content-Type\s?:/i', '', $header_field);
$header_field = trim ( $header_field );
$header_field_parts = explode(";", $header_field);
$header_content_type = trim( $header_field_parts[0] );
return $header_content_type;
}
/**
* Get available themes
*
* @param mixed $args
*/
function get_themes( $args = array() )
{
global $wp_theme_directories;
$defaults = array( 'errors' => false, 'allowed' => null, 'blog_id' => 0 );
$args = wp_parse_args( $args, $defaults );
if ( is_null($wp_theme_directories))
$wp_theme_directories = array();
// Register the default theme directory root
if ( count( $wp_theme_directories ) < 1 )
register_theme_directory( get_theme_root() );
$theme_directories = search_theme_directories();
if ( count( $wp_theme_directories ) > 1 ) {
// Make sure the current theme wins out, in case search_theme_directories() picks the wrong
// one in the case of a conflict. (Normally, last registered theme root wins.)
$current_theme = get_stylesheet();
if ( isset( $theme_directories[ $current_theme ] ) ) {
$root_of_current_theme = get_raw_theme_root( $current_theme );
if ( ! in_array( $root_of_current_theme, $wp_theme_directories ) )
$root_of_current_theme = WP_CONTENT_DIR . $root_of_current_theme;
$theme_directories[ $current_theme ]['theme_root'] = $root_of_current_theme;
}
}
if ( empty( $theme_directories ) )
return array();
if ( is_multisite() && null !== $args['allowed'] ) {
$allowed = $args['allowed'];
if ( 'network' === $allowed )
$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_network() );
elseif ( 'site' === $allowed )
$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_site( $args['blog_id'] ) );
elseif ( $allowed )
$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) );
else
$theme_directories = array_diff_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) );
}
return $theme_directories;
}
/**
* Parse available themes headers
*
*/
function parse_themes_headers( $all_templates )
{
if ( ! is_array($all_templates) )
return $all_templates;
foreach( $all_templates as $directory => $theme_data)
{
$theme_style_path = trailingslashit( $theme_data['theme_root']) . $theme_data['theme_file'];
if ( ! file_exists( $theme_style_path ))
continue;
$theme_headers = $this->get_theme_headers( $theme_style_path );
$all_templates[$directory]['headers'] = $theme_headers;
}
return $all_templates;
}
/**
* Return headers for a theme
*
* @param mixed $stylesheet_path
*/
function get_theme_headers($stylesheet_path)
{
$file_headers = array(
'Name' => 'Theme Name',
'ThemeURI' => 'Theme URI',
'Description' => 'Description',
'Author' => 'Author',
'AuthorURI' => 'Author URI',
'Version' => 'Version',
'Template' => 'Template',
'Status' => 'Status',
'Tags' => 'Tags',
'TextDomain' => 'Text Domain',
'DomainPath' => 'Domain Path',
);
$theme_headers = get_file_data( $stylesheet_path, $file_headers, 'theme' );
return $theme_headers;
}
/**
* Return if a theme is child or not
*
* @param mixed $theme_slug
* @param mixed $all_themes
*/
function is_child_theme($theme_slug, $all_themes)
{
$theme_data = $all_themes[$theme_slug];
if( isset($theme_data['headers']['Template']) && !empty($theme_data['headers']['Template']))
return TRUE;
return FALSE;
}
/**
* Return main theme directory slug
*
* @param mixed $theme_slug
* @param mixed $all_themes
*/
function get_main_theme_directory($theme_slug, $all_themes)
{
$theme_data = $all_themes[$theme_slug];
$theme_directory = $theme_slug;
if( isset($theme_data['headers']['Template']) && !empty($theme_data['headers']['Template']))
{
$theme_directory = $theme_data['headers']['Template'];
}
return $theme_directory;
}
function get_site_template_data( )
{
$data = array();
$data['themes_url'] = home_url() . $this->wph->default_variables['templates_directory'];
$all_templates = $this->get_themes();
$all_templates = $this->parse_themes_headers($all_templates);
$stylesheet = get_option( 'stylesheet' );
$data['use_child_theme'] = $this->is_child_theme($stylesheet, $all_templates);
$main_theme_directory = $this->get_main_theme_directory($stylesheet, $all_templates);
$data['main'] = array();
$data['main']['folder_name'] = $main_theme_directory;
if($data['use_child_theme'])
{
$data['child'] = array();
$data['child']['folder_name'] = $stylesheet;
}
return $data;
}
/**
* Recreate a url from a parsed array
*
* @param mixed $parts
*/
function build_parsed_url( $parse_url )
{
$url = (isset($parse_url['scheme']) ? "{$parse_url['scheme']}:" : '') .
((isset($parse_url['user']) || isset($parse_url['host'])) ? '//' : '') .
(isset($parse_url['user']) ? "{$parse_url['user']}" : '') .
(isset($parse_url['pass']) ? ":{$parse_url['pass']}" : '') .
(isset($parse_url['user']) ? '@' : '') .
(isset($parse_url['host']) ? "{$parse_url['host']}" : '') .
(isset($parse_url['port']) ? ":{$parse_url['port']}" : '') .
(isset($parse_url['path']) ? "{$parse_url['path']}" : '') .
(isset($parse_url['query']) ? "?{$parse_url['query']}" : '') .
(isset($parse_url['fragment']) ? "#{$parse_url['fragment']}" : '');
return $url;
}
/**
* Return upload paths and dirs
*
*/
function get_wp_upload_dir()
{
global $blog_id;
$siteurl = get_option( 'siteurl' );
$upload_path = trim( get_option( 'upload_path' ) );
if ( empty( $upload_path ) || 'wp-content/uploads' == $upload_path ) {
$dir = WP_CONTENT_DIR . '/uploads';
} elseif ( 0 !== strpos( $upload_path, ABSPATH ) ) {
// $dir is absolute, $upload_path is (maybe) relative to ABSPATH
$dir = path_join( ABSPATH, $upload_path );
} else {
$dir = $upload_path;
}
if(is_multisite())
{
$blog_details = get_blog_details( $blog_id );
$protocol = (is_ssl()) ? 'https://' : 'http://';
if ( empty($upload_path) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) )
$url = $protocol . $blog_details->domain . $blog_details->path . ltrim($this->wph->default_variables['network']['content_path'], '/') .'/uploads';
else
$url = $protocol . $blog_details->domain . $blog_details->path . $upload_path;
}
else
{
if ( !$url = get_option( 'upload_url_path' ) )
{
if ( empty($upload_path) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) )
$url = WP_CONTENT_URL . '/uploads';
else
$url = trailingslashit( $siteurl ) . $upload_path;
}
}
/*
* Honor the value of UPLOADS. This happens as long as ms-files rewriting is disabled.
* We also sometimes obey UPLOADS when rewriting is enabled -- see the next block.
*/
if ( defined( 'UPLOADS' ) && ! ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) ) {
$dir = ABSPATH . UPLOADS;
$url = trailingslashit( $siteurl ) . UPLOADS;
}
// If multisite (and if not the main site in a post-MU network)
if ( is_multisite() && ! ( is_main_network() && is_main_site() && defined( 'MULTISITE' ) ) ) {
if ( ! get_site_option( 'ms_files_rewriting' ) ) {
/*
* If ms-files rewriting is disabled (networks created post-3.5), it is fairly
* straightforward: Append sites/%d if we're not on the main site (for post-MU
* networks). (The extra directory prevents a four-digit ID from conflicting with
* a year-based directory for the main site. But if a MU-era network has disabled
* ms-files rewriting manually, they don't need the extra directory, as they never
* had wp-content/uploads for the main site.)
*/
if ( defined( 'MULTISITE' ) )
$ms_dir = '/sites/' . get_current_blog_id();
else
$ms_dir = '/' . get_current_blog_id();
$dir .= $ms_dir;
$url .= $ms_dir;
} elseif ( defined( 'UPLOADS' ) && ! ms_is_switched() ) {
/*
* Handle the old-form ms-files.php rewriting if the network still has that enabled.
* When ms-files rewriting is enabled, then we only listen to UPLOADS when:
* 1) We are not on the main site in a post-MU network, as wp-content/uploads is used
* there, and
* 2) We are not switched, as ms_upload_constants() hardcodes these constants to reflect
* the original blog ID.
*
* Rather than UPLOADS, we actually use BLOGUPLOADDIR if it is set, as it is absolute.
* (And it will be set, see ms_upload_constants().) Otherwise, UPLOADS can be used, as
* as it is relative to ABSPATH. For the final piece: when UPLOADS is used with ms-files
* rewriting in multisite, the resulting URL is /files. (#WP22702 for background.)
*/
if ( defined( 'BLOGUPLOADDIR' ) )
$dir = untrailingslashit( BLOGUPLOADDIR );
else
$dir = ABSPATH . UPLOADS;
$url = trailingslashit( $siteurl ) . 'files';
}
}
$basedir = $dir;
$baseurl = $url;
$subdir = '';
if ( get_option( 'uploads_use_yearmonth_folders' ) ) {
// Generate the yearly and monthly dirs
$time = current_time( 'mysql' );
$y = substr( $time, 0, 4 );
$m = substr( $time, 5, 2 );
$subdir = "/$y/$m";
}
$dir .= $subdir;
$url .= $subdir;
return array(
'path' => wp_normalize_path ($dir),
'url' => $url,
'subdir' => $subdir,
'basedir' => wp_normalize_path ($basedir),
'baseurl' => $baseurl,
'error' => false,
);
}
/**
* Return active blogs where the plugin is available
*
*/
function ms_get_plugin_active_blogs()
{
$plugin_slug = 'wp-hide-security-enhancer-pro/wp-hide.php';
$args = array(
'public' => 1,
'archived' => 0,
'spam' => 0,
'deleted' => 0,
'limit' => 9999
);
$network_sites = get_sites( $args );
if ( !function_exists( 'get_plugins' ) )
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
//check if plugin available to all sites, being network active
if(is_plugin_active_for_network( $plugin_slug ))
return $network_sites;
//filter out the sites where plugin is not active
if ( !function_exists( 'is_plugin_active' ) )
include_once(ABSPATH.'wp-admin/includes/plugin.php');
foreach ( $network_sites as $key => $network_site )
{
switch_to_blog( $network_site->blog_id );
if ( ! is_plugin_active( $plugin_slug ) )
unset ( $network_sites[ $key ] );
restore_current_blog();
}
//reindex
$network_sites = array_values($network_sites);
return $network_sites;
}
/**
* Create a Lock functionality using the MySql
*
* @param mixed $lock_name
* @param mixed $release_timeout
*
* @return bool False if a lock couldn't be created or if the lock is still valid. True otherwise.
*/
function create_lock( $lock_name, $release_timeout = null )
{
global $wpdb, $blog_id;
if ( ! $release_timeout ) {
$release_timeout = 10;
}
$lock_option = $lock_name . '.lock';
// Try to lock.
$lock_result = $wpdb->query( $wpdb->prepare( "INSERT INTO `". $wpdb->sitemeta ."` (`site_id`, `meta_key`, `meta_value`)
SELECT %s, %s, %s FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `". $wpdb->sitemeta ."`
WHERE `meta_key` = %s AND `meta_value` != '')
LIMIT 1", $blog_id, $lock_option, time(), $lock_option) );
if ( ! $lock_result )
{
$lock_result = $this->get_lock( $lock_option );
// If a lock couldn't be created, and there isn't a lock, bail.
if ( ! $lock_result ) {
return false;
}
// Check to see if the lock is still valid. If it is, bail.
if ( $lock_result > ( time() - $release_timeout ) ) {
return false;
}
// There must exist an expired lock, clear it and re-gain it.
$this->release_lock( $lock_name );
return $this->create_lock( $lock_name, $release_timeout );
}
// Update the lock, as by this point we've definitely got a lock, just need to fire the actions.
$this->update_lock( $lock_option, time() );
return true;
}
/**
* Retrieve a lock value
*
* @param mixed $lock_name
* @param mixed $return_full_row
*/
private function get_lock( $lock_name, $return_full_row = FALSE )
{
global $wpdb;
$mysq_query = $wpdb->get_row( $wpdb->prepare("SELECT `site_id`, `meta_key`, `meta_value` FROM `". $wpdb->sitemeta ."`
WHERE `meta_key` = %s", $lock_name ) );
if ( $return_full_row === TRUE )
return $mysq_query;
if ( is_object($mysq_query) && isset ( $mysq_query->meta_value ) )
return $mysq_query->meta_value;
return FALSE;
}
/**
* Update lock value
*
* @param mixed $lock_name
* @param mixed $lock_value
*/
private function update_lock( $lock_name, $lock_value )
{
global $wpdb;
$mysq_query = $wpdb->query( $wpdb->prepare("UPDATE `". $wpdb->sitemeta ."`
SET meta_value = %s
WHERE meta_key = %s", $lock_value, $lock_name) );
return $mysq_query;
}
/**
* Releases an upgrader lock.
*
* @param string $lock_name The name of this unique lock.
* @return bool True if the lock was successfully released. False on failure.
*/
function release_lock( $lock_name )
{
global $wpdb;
$lock_option = $lock_name . '.lock';
$mysq_query = $wpdb->query( $wpdb->prepare( "DELETE FROM `". $wpdb->sitemeta ."`
WHERE meta_key = %s", $lock_option ) );
return $mysq_query;
}
/**
* Delete an opition from all sites
*
* @param mixed $option_name
*/
function delete_all_sites_option( $option_name )
{
global $wpdb;
$active_sites = $this->ms_get_plugin_active_blogs();
foreach ( $active_sites as $active_site)
{
$mysql_query = "DELETE FROM " . $wpdb->base_prefix . ( $active_site->id > 1 ? $active_site->id .'_' : '') . "options
WHERE option_name = '". $option_name ."'";
$results = $wpdb->get_results( $mysql_query );
}
}
/**
* Save the current options list for all sites, to be used further, if any seting changes and rewrite still not applied
*
*/
function save_current_options_list( $_blog_id = '' )
{
if ( empty ( $_blog_id ) )
{
global $blog_id;
$_blog_id = $blog_id;
}
$site_modules_settings = $this->get_site_modules_settings( $_blog_id );
if ( $_blog_id == 'network' )
update_site_option('wph-previous-options-list', $site_modules_settings);
else
update_option('wph-previous-options-list', $site_modules_settings);
}
function save_all_sites_options_list()
{
$active_sites = $this->ms_get_plugin_active_blogs();
foreach ( $active_sites as $active_site)
{
switch_to_blog( $active_site->blog_id );
$this->save_current_options_list( );
restore_current_blog();
}
}
/**
* Check any POST actions for this plugin
*
*/
function check_post_actions()
{
//check for rewrite-update-confirm action within SETUP interface
if( isset( $_POST['wph-action'] ) && $_POST['wph-action'] == 'ruc' && isset($_POST['_nonce']) && wp_verify_nonce( $_POST['_nonce'], 'ruc-nonce' ) )
{
global $blog_id;
$response = array();
$found_error = FALSE;
if (is_multisite() )
{
$ms_settings = $this->get_site_settings('network');
if ( $this->wph->server_nginx_config === TRUE )
{
$nginx_rewrite_status = $this->nginx_test_sample_rewrite();
if ( $nginx_rewrite_status === FALSE )
{
$found_error = TRUE;
$response['status'] = 'error';
$response['message'] = __('The Confirmation failed:', 'wp-hide-security-enhancer');
$response['message'] .= "\n" . __('- The Rewrites does not appear to apply! Ensure the custom lines are placed in correct file and at correct spot.', 'wp-hide-security-enhancer');
$response['message'] .= "\n" . __('- The Nginx service is required to be restarted.', 'wp-hide-security-enhancer');
$response['message'] .= "\n" . __('- If your site require Basic Authentication ( HTTP password ) the procedure may fail.', 'wp-hide-security-enhancer');
}
else
{
delete_site_option( 'wph-rewrite-manual-install' );
delete_site_option( 'wph-errors-rewrite-to-file' );
$this->save_current_options_list( 'network' );
$response['status'] = 'success';
}
}
else
{
//nothing to check
delete_site_option( 'wph-rewrite-manual-install' );
delete_site_option( 'wph-errors-rewrite-to-file' );
$this->save_current_options_list( 'network' );
$response['status'] = 'success';
}
}
else
{
if ( $this->wph->server_nginx_config === TRUE )
{
$nginx_rewrite_status = $this->nginx_test_sample_rewrite();
if ( $nginx_rewrite_status === FALSE )
{
$found_error = TRUE;
$response['status'] = 'error';
$response['message'] = __('The Confirmation failed:', 'wp-hide-security-enhancer');
$response['message'] .= "\n" . __('- The Rewrites does not appear to apply! Ensure the custom lines are placed in correct file and at correct spot.', 'wp-hide-security-enhancer');
$response['message'] .= "\n" . __('- The Nginx service is required to be restarted.', 'wp-hide-security-enhancer');
$response['message'] .= "\n" . __('- If your site require Basic Authentication ( HTTP password ) the procedure may fail.', 'wp-hide-security-enhancer');
}
else
{
delete_site_option( 'wph-rewrite-manual-install' );
delete_site_option( 'wph-errors-rewrite-to-file' );
$this->save_current_options_list( 'network' );
$response['status'] = 'success';
}
}
else
{
$settings = $this->get_site_settings($blog_id);
$get_write_check_string_from_server = $this->get_write_check_string_from_server();
$write_check_string = isset($settings['write_check_string']) ? $settings['write_check_string'] : '';
if( !empty($write_check_string))
{
if ( $get_write_check_string_from_server == $write_check_string )
{
$this->rewrite_applied_correctly_to_site();
$response['status'] = 'success';
}
else
{
$found_error = TRUE;
$response['status'] = 'error';
$response['message'] = __('Unable to retrieve specific environment variables. Please check again the rewrite data on your server.', 'wp-hide-security-enhancer');
}
}
else
{
if ( empty ( $get_write_check_string_from_server ) )
{
$this->rewrite_applied_correctly_to_site();
$response['status'] = 'success';
}
else
{
$found_error = TRUE;
$response['status'] = 'error';
$response['message'] = __('Unable to retrieve specific environment variables. Please check again the rewrite data on your server.', 'wp-hide-security-enhancer');
}
}
}
}
echo json_encode( $response );
if ( $found_error === FALSE )
wp_logout();
die();
}
}
/**
* Try to access a specific sample url to test the rewrite engine functinality
*
*/
function nginx_test_sample_rewrite()
{
//check for forced confirmation
if ( isset ( $_POST['force_confirm'] ) && $_POST['force_confirm'] == 'true' )
return TRUE;
$global_settings = $this->get_global_settings ( );
$response = wp_remote_get( trailingslashit ( site_url() ) . $global_settings['sample_rewrite_hash'] . '/rewrite_test' );
if ( is_array( $response ) )
{
if ( ! isset( $response['response']['code'] ) )
return FALSE;
//password protected
/*
if ( $response['response']['code'] == 401 )
return TRUE;
*/
if ( $response['response']['code'] != 200 )
return FALSE;
$body = json_decode( $response['body'] );
if ( $body === null || !isset($body->name) )
return FALSE;
return TRUE;
}
else if ( is_a( $response, 'WP_Error' ))
{
//some will return errors: cURL error 60: SSL certificate problem: unable to get local issuer certificate
//presume it works, as there is no other way to retrieve the url
if (isset($response->errors) && isset($response->errors['http_request_failed']))
{
reset( $response->errors['http_request_failed'] );
if ( strpos( current($response->errors['http_request_failed']), "cURL error 60") !== FALSE )
return TRUE;
}
return FALSE;
}
return FALSE;
}
/**
* Apply appropiate code for site where the rewrite appear to be correct
*
*/
function rewrite_applied_correctly_to_site( )
{
$blog_id_settings = $this->get_blog_id();
if ( $blog_id_settings == 'network' )
{
delete_site_option('wph-rewrite-manual-install');
delete_site_option('wph-errors-rewrite-to-file');
}
else
{
delete_option('wph-rewrite-manual-install');
delete_option('wph-errors-rewrite-to-file');
}
$this->save_current_options_list( $this->get_blog_id() );
}
/**
* Specific cache code to run on cron trigger
*
*/
function do_cron_cache()
{
//Disabled
}
/**
* Clear the cache
*
*/
function do_cache_clear()
{
$nonce = $_POST['_wpnonce'];
if ( ! wp_verify_nonce( $nonce, 'wp-hide-cache-clear' ) )
return FALSE;
//only for admins
If ( ! current_user_can ( 'manage_options' ) )
return FALSE;
$this->cache_clear();
}
/**
* Get cache size
*
*/
function get_cache_size()
{
$dir = WPH_CACHE_PATH;
$cache_size = 0;
if ( is_dir( $dir ) )
{
$objects = scandir( $dir );
foreach ($objects as $object)
{
if ( is_file( $dir . $object ))
$cache_size++;
}
}
return $cache_size;
}
/**
* Internal cache clear
*
*/
function cache_clear()
{
do_action('wp-hide/before_cache_clear');
$this->rrmdir( WPH_CACHE_PATH, TRUE );
//clear any plugin cache data
$this->site_cache_clear();
do_action('wp-hide/after_cache_clear');
}
/**
* Clear any cache plugins
*
*/
function site_cache_clear()
{
if (function_exists('wp_cache_clear_cache'))
wp_cache_clear_cache();
if (function_exists('w3tc_flush_all'))
w3tc_flush_all();
if (function_exists('opcache_reset') && ! ini_get( 'opcache.restrict_api' ) )
@opcache_reset();
if ( function_exists( 'rocket_clean_domain' ) )
rocket_clean_domain();
if (function_exists('wp_cache_clear_cache'))
wp_cache_clear_cache();
global $wp_fastest_cache;
if ( method_exists( 'WpFastestCache', 'deleteCache' ) && !empty( $wp_fastest_cache ) )
$wp_fastest_cache->deleteCache();
//If your host has installed APC cache this plugin allows you to clear the cache from within WordPress
if (function_exists('apc_clear_cache'))
apc_clear_cache();
if (function_exists('fvm_purge_all'))
fvm_purge_all();
if ( class_exists( 'autoptimizeCache' ) )
autoptimizeCache::clearall();
//WPEngine
if ( class_exists( 'WpeCommon' ) )
{
if ( method_exists( 'WpeCommon', 'purge_memcached' ) )
WpeCommon::purge_memcached();
if ( method_exists( 'WpeCommon', 'clear_maxcdn_cache' ) )
WpeCommon::clear_maxcdn_cache();
if ( method_exists( 'WpeCommon', 'purge_varnish_cache' ) )
WpeCommon::purge_varnish_cache();
}
if (class_exists('Cache_Enabler_Disk') && method_exists('Cache_Enabler_Disk', 'clear_cache'))
Cache_Enabler_Disk::clear_cache();
}
/**
* Recursivelly remove all fodlers and files within a directory
*
* @param mixed $dir
*/
function rrmdir( $dir, $xclude_parent = FALSE )
{
if (is_dir($dir))
{
$objects = scandir($dir);
foreach ($objects as $object)
{
if ( is_file( $dir . $object ))
@unlink ( $dir . $object);
}
reset($objects);
if($xclude_parent !== TRUE)
rmdir($dir);
}
}
/**
* Filter width htmlspecialchars_decode for multidimensional array
*
* @param mixed $value
*/
function filter_htmlspecialchars_decode( &$value )
{
$value = htmlspecialchars_decode($value);
}
/**
* Return the home path relative to domain base
* e.g. http://develop.com/dev/wp-hide returns /dev/wp-hide/
*
*/
function get_home_root()
{
if(is_multisite())
{
$slashed_home = trailingslashit( network_site_url() );
$home_root = parse_url( $slashed_home, PHP_URL_PATH );
}
else
{
$home_root = parse_url(home_url());
if ( isset( $home_root['path'] ) )
$home_root = trailingslashit($home_root['path']);
else
$home_root = '/';
}
return $home_root;
}
/**
* Return a list of curent site domain/domains
*
*/
function get_instance_domains()
{
//use cached if exists
if ( is_array ( $this->wph->instance_domains ) && count ( $this->wph->instance_domains ) > 0 )
return $this->wph->instance_domains;
if (is_multisite())
{
$sites_to_process = $this->ms_get_plugin_active_blogs();
foreach( $sites_to_process as $site_to_process )
{
if ( array_search( $site_to_process->domain, $this->wph->instance_domains ) === FALSE )
$this->wph->instance_domains[] = $site_to_process->domain;
}
}
else
{
$domain = untrailingslashit ( preg_replace('/:[0-9]+/', '', str_replace(array ("https://" , "http://"), "", site_url() )) );
$this->wph->instance_domains[] = $domain;
}
return $this->wph->instance_domains;
}
/**
* Retrieve a system environment value
*
* @param mixed $environment_name
*/
function get_phpinfo_data ( $environment_name, $category = 'Default' )
{
$php_info_array = $this->phpinfo_to_array();
if ( $php_info_array === FALSE )
return FALSE;
if ( ! isset ( $php_info_array [ $category ] ) )
return FALSE;
if ( isset ( $php_info_array [ $category ][ $environment_name ] ) )
return $php_info_array [ $category ][ $environment_name ];
else
return FALSE;
}
/**
* Return the phpinfo data into an array
*
*/
function phpinfo_to_array( $module = INFO_ALL )
{
if ( ! function_exists( 'phpinfo' ) )
return FALSE;
ob_start();
phpinfo( $module );
$php_info_array = array();
$info_lines = explode("\n", strip_tags(ob_get_clean(), "<tr><td><h2>"));
$cat = "Default";
foreach( $info_lines as $line )
{
preg_match("~<h2>(.*)</h2>~", $line, $title) ? $cat = $title[1] : null;
if(preg_match("~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~", $line, $val))
{
$php_info_array[$cat][ trim ( $val[1] ) ] = trim ( $val[2] );
}
elseif(preg_match("~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~", $line, $val))
{
$php_info_array[$cat][ trim ( $val[1] ) ] = array("local" => trim ( $val[2] ), "master" => trim ( $val[3]) );
}
}
return $php_info_array;
}
/**
* Safe Print_r to be used inside buffering
*
* @param mixed $var
* @param mixed $return
* @param mixed $html
* @param mixed $level
*/
function obsafe_print_r($var, $return = false, $html = false, $level = 0)
{
$spaces = "";
$space = $html ? " " : " ";
$newline = $html ? "<br />" : "\n";
for ($i = 1; $i <= 6; $i++) {
$spaces .= $space;
}
$tabs = $spaces;
for ($i = 1; $i <= $level; $i++) {
$tabs .= $spaces;
}
if (is_array($var)) {
$title = "Array";
} elseif (is_object($var)) {
$title = get_class($var)." Object";
}
$output = $title . $newline . $newline;
foreach($var as $key => $value) {
if (is_array($value) || is_object($value)) {
$level++;
$value = $this->obsafe_print_r($value, true, $html, $level);
$level--;
}
$output .= $tabs . "[" . $key . "] => " . $value . $newline;
}
if ($return) return $output;
else echo $output;
}
/**
* Save a message log to a debug file
*
* @param mixed $text
*/
function log_save($text)
{
$myfile = fopen(WPH_PATH . "/debug.txt", "a") or die("Unable to open file!");
$txt = $text . "\n";
fwrite($myfile, $txt);
fclose($myfile);
}
}
?>