/** * Fixes environment once event occurs * * @param Config $config * @param string $event * @param Config|null $old_config * @throws Util_Environment_Exceptions */ public function fix_on_event($config, $event, $old_config = null) { if ($config->get_boolean('cdn.enabled') && !Cdn_Util::is_engine_mirror($config->get_string('cdn.engine'))) { if ($old_config != null && $config->get_integer('cdn.queue.interval') != $old_config->get_integer('cdn.queue.interval')) { $this->unschedule_queue_process(); } if (!wp_next_scheduled('w3_cdn_cron_queue_process')) { wp_schedule_event(time(), 'w3_cdn_cron_queue_process', 'w3_cdn_cron_queue_process'); } } else { $this->unschedule_queue_process(); } if ($config->get_boolean('cdn.enabled') && $config->get_boolean('cdn.autoupload.enabled') && !Cdn_Util::is_engine_mirror($config->get_string('cdn.engine'))) { if ($old_config != null && $config->get_integer('cdn.autoupload.interval') != $old_config->get_integer('cdn.autoupload.interval')) { $this->unschedule_upload(); } if (!wp_next_scheduled('w3_cdn_cron_upload')) { wp_schedule_event(time(), 'w3_cdn_cron_upload', 'w3_cdn_cron_upload'); } } else { $this->unschedule_upload(); } $exs = new Util_Environment_Exceptions(); if ($config->get_boolean('cdn.enabled')) { try { $this->table_create($event == 'activate'); } catch (\Exception $ex) { $exs->push($ex); } } if (count($exs->exceptions()) > 0) { throw $exs; } }
/** * Fixes environment after plugin deactivation * * @throws Util_Environment_Exceptions * @return array */ public function fix_after_deactivation() { $exs = new Util_Environment_Exceptions(); try { $this->delete_addin(); } catch (Util_WpFile_FilesystemOperationException $ex) { $exs->push($ex); } $this->unschedule(); if (count($exs->exceptions()) > 0) { throw $exs; } }
/** * Fixes environment after plugin deactivation * * @param Config $config * @throws Util_Environment_Exceptions */ public function fix_after_deactivation($config) { $exs = new Util_Environment_Exceptions(); // call plugin-related handlers foreach ($this->get_handlers($config) as $h) { try { $h->fix_after_deactivation(); } catch (Util_Environment_Exceptions $ex) { $exs->push($ex); } } try { do_action('w3tc_environment_fix_after_deactivation', $config); } catch (Util_Environment_Exceptions $ex) { $exs->push($ex); } if (count($exs->exceptions()) > 0) { throw $exs; } }
/** * Minifiers availability error handling * * @param Config $config * @param Util_Environment_Exceptions $exs */ private function verify_engine_working($config, $exs) { $minifiers_errors = array(); if ($config->get_string('minify.js.engine') == 'yuijs') { $path_java = $config->get_string('minify.yuijs.path.java'); $path_jar = $config->get_string('minify.yuijs.path.jar'); if (!file_exists($path_java)) { $minifiers_errors[] = sprintf('YUI Compressor (JS): JAVA executable path was not found. The default minifier JSMin will be used instead.'); } elseif (!file_exists($path_jar)) { $minifiers_errors[] = sprintf('YUI Compressor (JS): JAR file path was not found. The default minifier JSMin will be used instead.'); } } if ($config->get_string('minify.css.engine') == 'yuicss') { $path_java = $config->get_string('minify.yuicss.path.java'); $path_jar = $config->get_string('minify.yuicss.path.jar'); if (!file_exists($path_java)) { $minifiers_errors[] = sprintf('YUI Compressor (CSS): JAVA executable path was not found. The default CSS minifier will be used instead.'); } elseif (!file_exists($path_jar)) { $minifiers_errors[] = sprintf('YUI Compressor (CSS): JAR file path was not found. The default CSS minifier will be used instead.'); } } if ($config->get_string('minify.js.engine') == 'ccjs') { $path_java = $config->get_string('minify.ccjs.path.java'); $path_jar = $config->get_string('minify.ccjs.path.jar'); if (!file_exists($path_java)) { $minifiers_errors[] = sprintf('Closure Compiler: JAVA executable path was not found. The default minifier JSMin will be used instead.'); } elseif (!file_exists($path_jar)) { $minifiers_errors[] = sprintf('Closure Compiler: JAR file path was not found. The default minifier JSMin will be used instead.'); } } if (count($minifiers_errors)) { $minify_error = 'The following minifiers cannot be found or are no longer working:</p><ul>'; foreach ($minifiers_errors as $minifiers_error) { $minify_error .= '<li>' . $minifiers_error . '</li>'; } $minify_error .= '</ul><p>This message will automatically disappear once the issue is resolved.'; $exs->push(new Util_Environment_Exception($minify_error)); } }
/** * Fixes folders * * @param Config $config * @param Util_Environment_Exceptions $exs */ private function fix_folders($config, $exs) { if (!$config->get_boolean('pgcache.enabled')) { return; } // folder that we delete if exists and not writeable if ($config->get_string('pgcache.engine') == 'file_generic') { $dir = W3TC_CACHE_PAGE_ENHANCED_DIR; } else { if ($config->get_string('pgcache.engine') != 'file') { $dir = W3TC_CACHE_DIR . '/page'; } else { return; } } try { if (file_exists($dir) && !is_writeable($dir)) { Util_WpFile::delete_folder($dir, '', $_SERVER['REQUEST_URI']); } } catch (Util_WpFile_FilesystemRmdirException $ex) { $exs->push($ex); } }
/** * Check config file * * @param Config $config * @param Util_Environment_Exceptions $exs */ private function notify_no_config_present($config, $exs) { if ((file_exists(Config::util_config_filename(0, false)) || file_exists(Config::util_config_filename_legacy(0, false))) && $config->get_integer('common.instance_id', 0) != 0) { return; } $onclick = 'document.location.href=\'' . addslashes(wp_nonce_url('admin.php?page=w3tc_general&w3tc_save_options', 'w3tc')) . '\';'; $button = '<input type="button" class="button w3tc" ' . 'value="save the settings" onclick="' . $onclick . '" />'; $exs->push(new Util_Environment_Exception('<strong>W3 Total Cache:</strong> ' . 'Default settings are in use. The configuration file could ' . 'not be read or doesn\'t exist. Please ' . $button . ' to create the file.')); }
/** * * * @param Util_Environment_Exceptions $exs * @param string $path * @param string $rules * @param string $start * @param string $end * @param array $order */ public static function add_rules($exs, $path, $rules, $start, $end, $order) { if (empty($path)) { return; } $data = @file_get_contents($path); if ($data === false) { $data = ''; } $rules_missing = !empty($rules) && strstr(Util_Rule::clean_rules($data), Util_Rule::clean_rules($rules)) === false; if (!$rules_missing) { return; } $replace_start = strpos($data, $start); $replace_end = strpos($data, $end); if ($replace_start !== false && $replace_end !== false && $replace_start < $replace_end) { $replace_length = $replace_end - $replace_start + strlen($end) + 1; } else { $replace_start = false; $replace_length = 0; $search = $order; foreach ($search as $string => $length) { $replace_start = strpos($data, $string); if ($replace_start !== false) { $replace_start += $length; break; } } } if ($replace_start !== false) { $data = Util_Rule::trim_rules(substr_replace($data, $rules, $replace_start, $replace_length)); } else { $data = Util_Rule::trim_rules($data . $rules); } if (strpos($path, W3TC_CACHE_DIR) === false || Util_Environment::is_nginx()) { try { Util_WpFile::write_to_file($path, $data); } catch (Util_WpFile_FilesystemOperationException $ex) { if ($replace_start !== false) { $exs->push(new Util_WpFile_FilesystemModifyException($ex->getMessage(), $ex->credentials_form(), sprintf(__('Edit file <strong>%s </strong> and replace all lines between and including <strong>%s</strong> and <strong>%s</strong> markers with:', 'w3-total-caceh'), $path, $start, $end), $path, $rules)); } else { $exs->push(new Util_WpFile_FilesystemModifyException($ex->getMessage(), $ex->credentials_form(), sprintf(__('Edit file <strong>%s</strong> and add the following rules above the WordPress directives:', 'w3-total-cache'), $path), $path, $rules)); } return; } } else { if (!@file_exists(dirname($path))) { Util_File::mkdir_from(dirname($path), W3TC_CACHE_DIR); } if (!@file_put_contents($path, $data)) { try { Util_WpFile::delete_folder(dirname($path), '', $_SERVER['REQUEST_URI']); } catch (Util_WpFile_FilesystemOperationException $ex) { $exs->push($ex); return; } } } Util_Rule::after_rules_modified(); }