Current Path : /var/test/www/mainsite/wp-content/plugins/unyson/framework/helpers/ |
Current File : /var/test/www/mainsite/wp-content/plugins/unyson/framework/helpers/class-fw-wp-filesystem.php |
<?php if (!defined('FW')) die('Forbidden'); class FW_WP_Filesystem { /** * Request WP Filesystem access * @param string $context * @param string $url * @param array $extra_fields * @return null|bool // todo: Create a new method that will return WP_Error with message on failure * null - if has no access and the input credentials form was displayed * false - if user submitted wrong credentials * true - if we have filesystem access */ final public static function request_access($context = null, $url = null, $extra_fields = array()) { /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; if ($wp_filesystem) { if ( is_object($wp_filesystem) && !(is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) ) { return true; // already initialized } } if ( empty( $url ) ) { $url = fw_current_url(); } if ( get_filesystem_method() === 'direct' ) { // in case if direct access is available /* you can safely run request_filesystem_credentials() without any issues and don't need to worry about passing in a URL */ $creds = request_filesystem_credentials( site_url() . '/wp-admin/', '', false, false, null ); /* initialize the API */ if ( ! WP_Filesystem( $creds ) ) { /* any problems and we exit */ trigger_error( __( 'Cannot connect to Filesystem directly', 'fw' ), E_USER_WARNING ); return false; } } else { $creds = request_filesystem_credentials( $url, '', false, $context, $extra_fields ); if ( ! $creds ) { // the form was printed to the user return null; } /* initialize the API */ if ( ! WP_Filesystem( $creds ) ) { /* any problems and we exit */ request_filesystem_credentials( $url, '', true, $context, $extra_fields ); // the third parameter is true to show error to the user return false; } } if ( ! is_object($wp_filesystem) || (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) ) { return false; } if ( $wp_filesystem->abspath() && $wp_filesystem->wp_content_dir() && $wp_filesystem->wp_plugins_dir() && $wp_filesystem->wp_themes_dir() && $wp_filesystem->find_folder($context) ) { return true; } else { return false; } } /** * @return array {base_dir_real_path => base_dir_wp_filesystem_path} */ public static function get_base_dirs_map() { /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; if (!$wp_filesystem) { trigger_error('Filesystem is not available', E_USER_ERROR); } elseif (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { trigger_error('Filesystem: '. $wp_filesystem->errors->get_error_message(), E_USER_ERROR); } try { $cache_key = 'fw_wp_filesystem/base_dirs_map'; return FW_Cache::get($cache_key); } catch (FW_Cache_Not_Found_Exception $e) { // code from $wp_filesystem->wp_themes_dir() { $themes_dir = get_theme_root(); // Account for relative theme roots if ( '/themes' == $themes_dir || ! is_dir( $themes_dir ) ) { $themes_dir = WP_CONTENT_DIR . $themes_dir; } } $dirs = array( fw_fix_path(ABSPATH) => fw_fix_path($wp_filesystem->abspath()), fw_fix_path(WP_CONTENT_DIR) => fw_fix_path($wp_filesystem->wp_content_dir()), fw_fix_path(WP_PLUGIN_DIR) => fw_fix_path($wp_filesystem->wp_plugins_dir()), fw_fix_path($themes_dir) => fw_fix_path($wp_filesystem->wp_themes_dir()), ); FW_Cache::set($cache_key, $dirs); return $dirs; } } /** * Convert real file path to WP Filesystem path * @param string $real_path * @return string|false */ final public static function real_path_to_filesystem_path($real_path) { /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; if (!$wp_filesystem) { trigger_error('Filesystem is not available', E_USER_ERROR); } elseif (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { trigger_error('Filesystem: '. $wp_filesystem->errors->get_error_message(), E_USER_ERROR); } $real_path = fw_fix_path($real_path); foreach (self::get_base_dirs_map() as $base_real_path => $base_wp_filesystem_path) { $prefix_regex = '/^'. preg_quote($base_real_path, '/') .'($|\/.*)/'; // check if path is inside base path if (!preg_match($prefix_regex, $real_path)) { continue; } if ($base_real_path === '/') { $relative_path = $real_path; } else { $relative_path = preg_replace($prefix_regex, '$1', $real_path); } return $base_wp_filesystem_path . $relative_path; } return false; } /** * Convert WP Filesystem path to real file path * @param string $wp_filesystem_path * @return string|false */ final public static function filesystem_path_to_real_path($wp_filesystem_path) { /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; if (!$wp_filesystem) { trigger_error('Filesystem is not available', E_USER_ERROR); } elseif (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { trigger_error('Filesystem: '. $wp_filesystem->errors->get_error_message(), E_USER_ERROR); } $wp_filesystem_path = fw_fix_path($wp_filesystem_path); foreach (self::get_base_dirs_map() as $base_real_path => $base_wp_filesystem_path) { $prefix_regex = '/^'. preg_quote($base_wp_filesystem_path, '/') .'($|\/.*)/'; // check if path is inside base path if (!preg_match($prefix_regex, $wp_filesystem_path)) { continue; } if ($base_wp_filesystem_path === '/') { $relative_path = $wp_filesystem_path; } else { $relative_path = preg_replace($prefix_regex, '$1', $wp_filesystem_path); } return $base_real_path . $relative_path; } return false; } /** * Check if there is direct filesystem access, so we can make changes without asking the credentials via form * @param string|null $context * @return bool */ final public static function has_direct_access($context = null) { /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; if ($wp_filesystem) { if (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { return false; } else { return $wp_filesystem->method === 'direct'; } } if (get_filesystem_method(array(), $context) === 'direct') { ob_start(); { $creds = request_filesystem_credentials(admin_url(), '', false, $context, null); } ob_end_clean(); if ( WP_Filesystem($creds) ) { return true; } } return false; } /** * Create wp filesystem directory recursive * @param string $wp_filesystem_dir_path * @return bool */ final public static function mkdir_recursive($wp_filesystem_dir_path) { /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; if (!$wp_filesystem) { trigger_error('Filesystem is not available', E_USER_ERROR); } elseif (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code()) { trigger_error('Filesystem: '. $wp_filesystem->errors->get_error_message(), E_USER_ERROR); } $wp_filesystem_dir_path = fw_fix_path($wp_filesystem_dir_path); $path = false; foreach (self::get_base_dirs_map() as $base_real_path => $base_wp_filesystem_path) { $prefix_regex = '/^'. preg_quote($base_wp_filesystem_path, '/') .'($|\/)/'; // check if path is inside base path if (!preg_match($prefix_regex, $wp_filesystem_dir_path)) { continue; } $path = $base_wp_filesystem_path; break; } if (!$path) { trigger_error( sprintf( __('Cannot create directory "%s". It must be inside "%s"', 'fw'), $wp_filesystem_dir_path, implode(__('" or "', 'fw'), self::get_base_dirs_map()) ), E_USER_WARNING ); return false; } if ($path === '/') { $rel_path = $wp_filesystem_dir_path; } else { $rel_path = preg_replace('/^'. preg_quote($path, '/') .'($|\/.*)/', '$1', $wp_filesystem_dir_path); } // improvement: do not check directory for existence if it's known that sure it doesn't exist $check_if_exists = true; foreach (explode('/', ltrim($rel_path, '/')) as $dir_name) { $path .= '/' . $dir_name; // When WP FS abspath is '/', $path can be '//wp-content'. Fix it '/wp-content' $path = fw_fix_path($path); if ($check_if_exists) { if ($wp_filesystem->is_dir($path)) { // do nothing if exists continue; } else { // do not check anymore, next directories sure doesn't exist $check_if_exists = false; } } if (!$wp_filesystem->mkdir($path)) { return false; } } return true; } /** * @param $file_path * @param $content * * @return bool|WP_Error */ public static function put( $file_path, $content ) { self::init_file_system(); /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; if ( ! $wp_filesystem->put_contents( $file_path, $content ) ) { return new WP_Error( 'fs_error_put_content', esc_html__( 'Error writing to file: ', 'fw' ) . wp_basename( $file_path ) ); } return true; } /** * @param $file_path * * @return bool|mixed|WP_Error */ public static function get( $file_path ) { self::init_file_system(); /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; $content = $wp_filesystem->get_contents( $file_path ); if ( false === $content ) { return new WP_Error( 'fs_error_get_content', esc_html__( 'Error to get content from file: ', 'fw' ) . wp_basename( $file_path ) ); } return $content; } /** * Initialize wp files system. */ public static function init_file_system() { if ( self::is_ready() ) { return; } include_once( ABSPATH . '/wp-admin/includes/file.php' ); WP_Filesystem(); } /** * If is initialized and has no errors * @return bool * @since 2.6.8 */ public static function is_ready() { /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; return $wp_filesystem && is_wp_error($wp_filesystem->errors) && !$wp_filesystem->errors->get_error_code(); } }