예제 #1
0
 /**
  * Runs plugin
  *
  * @return void
  */
 function run()
 {
     add_action('init', array(&$this, 'init'));
     add_action('admin_bar_menu', array(&$this, 'admin_bar_menu'), 150);
     if (isset($_REQUEST['w3tc_theme']) && isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT'] == W3TC_POWERED_BY) {
         add_filter('template', array(&$this, 'template_preview'));
         add_filter('stylesheet', array(&$this, 'stylesheet_preview'));
     } elseif ($this->_config->get_boolean('mobile.enabled') || $this->_config->get_boolean('referrer.enabled')) {
         add_filter('template', array(&$this, 'template'));
         add_filter('stylesheet', array(&$this, 'stylesheet'));
     }
     /**
      * Create cookies to flag if a pgcache role was loggedin
      */
     if (!$this->_config->get_boolean('pgcache.reject.logged') && $this->_config->get_array('pgcache.reject.logged_roles')) {
         add_action('set_logged_in_cookie', array(&$this, 'check_login_action'), 0, 5);
         add_action('clear_auth_cookie', array(&$this, 'check_login_action'), 0, 5);
     }
     /**
      * CloudFlare support
      */
     if ($this->_config->get_boolean('cloudflare.enabled')) {
         w3_require_once(W3TC_LIB_W3_DIR . '/CloudFlare.php');
         @($w3_cloudflare = new W3_CloudFlare());
         $w3_cloudflare->fix_remote_addr();
     }
     if ($this->_config->get_string('common.support') == 'footer') {
         add_action('wp_footer', array(&$this, 'footer'));
     }
     if ($this->can_ob()) {
         ob_start(array(&$this, 'ob_callback'));
     }
 }
예제 #2
0
 /**
  * Send CloudFlare API request
  *
  * @return void
  */
 function action_cloudflare_api_request()
 {
     $result = false;
     $response = null;
     $actions = array('devmode', 'sec_lvl', 'fpurge_ts');
     w3_require_once(W3TC_LIB_W3_DIR . '/Request.php');
     $email = W3_Request::get_string('email');
     $key = W3_Request::get_string('key');
     $zone = W3_Request::get_string('zone');
     $action = W3_Request::get_string('command');
     $value = W3_Request::get_string('value');
     $nonce = W3_Request::get_string('_wpnonce');
     if (!wp_verify_nonce($nonce, 'w3tc')) {
         $error = 'Access denied.';
     } elseif (!$email) {
         $error = 'Empty email.';
     } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
         $error = 'Invalid email.';
     } elseif (!$key) {
         $error = 'Empty key.';
     } elseif (!$zone) {
         $error = 'Empty zone.';
     } elseif (strpos($zone, '.') === false) {
         $error = 'Invalid domain.';
     } elseif (!in_array($action, $actions)) {
         $error = 'Invalid action.';
     } else {
         $config = array('email' => $email, 'key' => $key, 'zone' => $zone);
         w3_require_once(W3TC_LIB_W3_DIR . '/CloudFlare.php');
         @($w3_cloudflare = new W3_CloudFlare($config));
         @set_time_limit($this->_config->get_integer('timelimit.cloudflare_api_request'));
         $response = $w3_cloudflare->api_request($action, $value);
         if ($response) {
             if ($response->result == 'success') {
                 $result = true;
                 $error = 'OK';
             } else {
                 $error = $response->msg;
             }
         } else {
             $error = 'Unable to make CloudFlare API request.';
         }
     }
     $return = array('result' => $result, 'error' => $error, 'response' => $response);
     echo json_encode($return);
     exit;
 }
 /**
  * Purge the CloudFlare cache
  * @return void
  */
 function flush_cloudflare()
 {
     $response = null;
     w3_require_once(W3TC_LIB_W3_DIR . '/Request.php');
     $email = $this->_config->get_string('email');
     $key = $this->_config->get_string('key');
     $zone = $this->_config->get_string('zone');
     if ($email && $key && $zone) {
         $config = array('email' => $email, 'key' => $key, 'zone' => $zone);
         w3_require_once(W3TC_LIB_W3_DIR . '/CloudFlare.php');
         @($w3_cloudflare = new W3_CloudFlare($config));
         $w3_cloudflare->purge();
     }
 }
예제 #4
0
 /**
  * Now actually allow CF to see when a comment is approved/not-approved.
  *
  * @param int $id
  * @param string $status
  * @return void
  */
 function cloudflare_set_comment_status($id, $status)
 {
     if ($status == 'spam') {
         $email = $this->_config->get_string('cloudflare.email');
         $key = $this->_config->get_string('cloudflare.key');
         if ($email && $key) {
             w3_require_once(W3TC_LIB_W3_DIR . '/CloudFlare.php');
             @($w3_cloudflare = new W3_CloudFlare(array('email' => $email, 'key' => $key)));
             $comment = get_comment($id);
             $value = array('a' => $comment->comment_author, 'am' => $comment->comment_author_email, 'ip' => $comment->comment_author_IP, 'con' => substr($comment->comment_content, 0, 100));
             $w3_cloudflare->external_event('WP_SPAM', json_encode($value));
         }
     }
 }
 /**
  * Options save action
  *
  * @return void
  */
 function action_save_options()
 {
     /**
      * Redirect params
      */
     $params = array();
     /**
      * Store error message regarding permalink not enabled
      */
     $redirect_permalink_error = '';
     /**
      * Read config
      * We should use new instance of WP_Config object here
      */
     $config = new W3_Config();
     if (!$this->_config->own_config_exists()) {
         $config->import_legacy_config();
     }
     $this->read_request($config);
     $config_admin = new W3_ConfigAdmin();
     $this->read_request($config_admin);
     if ($this->_page == 'w3tc_dashboard') {
         if (W3_Request::get_boolean('maxcdn')) {
             $config->set('cdn.enabled', true);
             $config->set('cdn.engine', 'maxcdn');
         }
     }
     /**
      * General tab
      */
     if ($this->_page == 'w3tc_general') {
         $file_nfs = W3_Request::get_boolean('file_nfs');
         $file_locking = W3_Request::get_boolean('file_locking');
         $config->set('pgcache.file.nfs', $file_nfs);
         $config->set('minify.file.nfs', $file_nfs);
         $config->set('dbcache.file.locking', $file_locking);
         $config->set('objectcache.file.locking', $file_locking);
         $config->set('pgcache.file.locking', $file_locking);
         $config->set('minify.file.locking', $file_locking);
         if (is_network_admin()) {
             if ($this->_config->get_boolean('common.force_master') !== $config->get_boolean('common.force_master') || !w3_force_master() && $this->_config->get_boolean('common.force_master') && $config->get_boolean('common.force_master') || w3_force_master() && !$this->_config->get_boolean('common.force_master') && !$config->get_boolean('common.force_master')) {
                 @unlink(W3TC_CACHE_BLOGMAP_FILENAME);
                 $blogmap_dir = dirname(W3TC_CACHE_BLOGMAP_FILENAME) . '/' . basename(W3TC_CACHE_BLOGMAP_FILENAME, '.php') . '/';
                 if (@is_dir($blogmap_dir)) {
                     w3_rmdir($blogmap_dir);
                 }
             }
             if ($config->get_boolean('common.force_master')) {
                 $config_admin->set('common.visible_by_master_only', true);
             }
         }
         /**
          * Check permalinks for page cache
          */
         if ($config->get_boolean('pgcache.enabled') && $config->get_string('pgcache.engine') == 'file_generic' && !get_option('permalink_structure')) {
             $config->set('pgcache.enabled', false);
             $redirect_permalink_error = 'fancy_permalinks_disabled_pgcache';
         }
         $w3_cloudflare = w3_instance('W3_CloudFlare');
         $w3_cloudflare->reset_settings_cache();
         if ($config->get_boolean('cloudflare.enabled') && $w3_cloudflare->minify_enabled() && $config->get_boolean('minify.enabled')) {
             $config->set('minify.enabled', false);
         }
         /**
          * Get New Relic application id
          */
         if ($config->get_boolean('newrelic.enabled')) {
             $method = W3_Request::get_string('application_id_method');
             $newrelic_prefix = '';
             if (w3_is_network() && w3_get_blog_id() != 0) {
                 $newrelic_prefix = $this->_config->get_string('newrelic.appname_prefix');
             }
             if (($newrelic_api_key = $config->get_string('newrelic.api_key')) && !$config->get_string('newrelic.account_id')) {
                 $nerser = w3_instance('W3_NewRelicService');
                 $account_id = $nerser->get_account_id($newrelic_api_key);
                 $config->set('newrelic.account_id', $account_id);
             }
             if ($method == 'dropdown' && $config->get_string('newrelic.application_id')) {
                 $application_id = $config->get_string('newrelic.application_id');
                 if ($config->get_string('newrelic.api_key') && $config->get_string('newrelic.account_id')) {
                     w3_require_once(W3TC_LIB_W3_DIR . '/NewRelicService.php');
                     $nerser = new W3_NewRelicService($config->get_string('newrelic.api_key'), $config->get_string('newrelic.account_id'));
                     $appname = $nerser->get_application_name($application_id);
                     $config->set('newrelic.appname', $appname);
                 }
             } else {
                 if ($method == 'manual' && $config->get_string('newrelic.appname')) {
                     if ($newrelic_prefix != '' && strpos($config->get_string('newrelic.appname'), $newrelic_prefix) === false) {
                         $application_name = $newrelic_prefix . $config->get_string('newrelic.appname');
                         $config->set('newrelic.appname', $application_name);
                     } else {
                         $application_name = $config->get_string('newrelic.appname');
                     }
                     if ($config->get_string('newrelic.api_key') && $config->get_string('newrelic.account_id')) {
                         w3_require_once(W3TC_LIB_W3_DIR . '/NewRelicService.php');
                         $nerser = new W3_NewRelicService($config->get_string('newrelic.api_key'), $config->get_string('newrelic.account_id'));
                         $application_id = $nerser->get_application_id($application_name);
                         if ($application_id) {
                             $config->set('newrelic.application_id', $application_id);
                         }
                     }
                 }
             }
         }
         if ($config->get_boolean('minify.enabled') && !$this->_config->get_boolean('minify.enabled') || $config->get_boolean('minify.enabled') && $config->get_boolean('browsercache.enabled') && !$this->_config->get_boolean('browsercache.enabled') || $config->get_boolean('minify.enabled') && $config->get_boolean('minify.auto') && !$this->_config->get_boolean('minify.auto') || $config->get_boolean('minify.enabled') && $config->get_string('minify.engine') != $this->_config->get_string('minify.engine')) {
             delete_transient('w3tc_minify_tested_filename_length');
         }
     }
     /**
      * Minify tab
      */
     if ($this->_page == 'w3tc_minify' && !$this->_config->get_boolean('minify.auto')) {
         $js_groups = array();
         $css_groups = array();
         $js_files = W3_Request::get_array('js_files');
         $css_files = W3_Request::get_array('css_files');
         foreach ($js_files as $theme => $templates) {
             foreach ($templates as $template => $locations) {
                 foreach ((array) $locations as $location => $types) {
                     foreach ((array) $types as $type => $files) {
                         foreach ((array) $files as $file) {
                             if (!empty($file)) {
                                 $js_groups[$theme][$template][$location]['files'][] = w3_normalize_file_minify($file);
                             }
                         }
                     }
                 }
             }
         }
         foreach ($css_files as $theme => $templates) {
             foreach ($templates as $template => $locations) {
                 foreach ((array) $locations as $location => $files) {
                     foreach ((array) $files as $file) {
                         if (!empty($file)) {
                             $css_groups[$theme][$template][$location]['files'][] = w3_normalize_file_minify($file);
                         }
                     }
                 }
             }
         }
         $config->set('minify.js.groups', $js_groups);
         $config->set('minify.css.groups', $css_groups);
         $js_theme = W3_Request::get_string('js_theme');
         $css_theme = W3_Request::get_string('css_theme');
         $params = array_merge($params, array('js_theme' => $js_theme, 'css_theme' => $css_theme));
     }
     if ($this->_page == 'w3tc_minify') {
         if ($config->get_integer('minify.auto.filename_length') > 246) {
             $config->set('minify.auto.filename_length', 246);
         }
         delete_transient('w3tc_minify_tested_filename_length');
     }
     /**
      * Browser Cache tab
      */
     if ($this->_page == 'w3tc_browsercache') {
         if ($config->get_boolean('browsercache.enabled') && $config->get_boolean('browsercache.no404wp') && !get_option('permalink_structure')) {
             $config->set('browsercache.no404wp', false);
             $redirect_permalink_error = 'fancy_permalinks_disabled_browsercache';
         }
         $config->set('browsercache.timestamp', time());
     }
     /**
      * Mobile tab
      */
     if ($this->_page == 'w3tc_mobile') {
         $groups = W3_Request::get_array('mobile_groups');
         $mobile_groups = array();
         $cached_mobile_groups = array();
         foreach ($groups as $group => $group_config) {
             $group = strtolower($group);
             $group = preg_replace('~[^0-9a-z_]+~', '_', $group);
             $group = trim($group, '_');
             if ($group) {
                 $theme = isset($group_config['theme']) ? trim($group_config['theme']) : 'default';
                 $enabled = isset($group_config['enabled']) ? (bool) $group_config['enabled'] : true;
                 $redirect = isset($group_config['redirect']) ? trim($group_config['redirect']) : '';
                 $agents = isset($group_config['agents']) ? explode("\r\n", trim($group_config['agents'])) : array();
                 $mobile_groups[$group] = array('theme' => $theme, 'enabled' => $enabled, 'redirect' => $redirect, 'agents' => $agents);
                 $cached_mobile_groups[$group] = $agents;
             }
         }
         /**
          * Allow plugins modify WPSC mobile groups
          */
         $cached_mobile_groups = apply_filters('cached_mobile_groups', $cached_mobile_groups);
         /**
          * Merge existent and delete removed groups
          */
         foreach ($mobile_groups as $group => $group_config) {
             if (isset($cached_mobile_groups[$group])) {
                 $mobile_groups[$group]['agents'] = (array) $cached_mobile_groups[$group];
             } else {
                 unset($mobile_groups[$group]);
             }
         }
         /**
          * Add new groups
          */
         foreach ($cached_mobile_groups as $group => $agents) {
             if (!isset($mobile_groups[$group])) {
                 $mobile_groups[$group] = array('theme' => '', 'enabled' => true, 'redirect' => '', 'agents' => $agents);
             }
         }
         /**
          * Allow plugins modify W3TC mobile groups
          */
         $mobile_groups = apply_filters('w3tc_mobile_groups', $mobile_groups);
         /**
          * Sanitize mobile groups
          */
         foreach ($mobile_groups as $group => $group_config) {
             $mobile_groups[$group] = array_merge(array('theme' => '', 'enabled' => true, 'redirect' => '', 'agents' => array()), $group_config);
             $mobile_groups[$group]['agents'] = array_unique($mobile_groups[$group]['agents']);
             $mobile_groups[$group]['agents'] = array_map('strtolower', $mobile_groups[$group]['agents']);
             sort($mobile_groups[$group]['agents']);
         }
         $enable_mobile = false;
         foreach ($mobile_groups as $group => $group_config) {
             if ($group_config['enabled']) {
                 $enable_mobile = true;
                 break;
             }
         }
         $config->set('mobile.enabled', $enable_mobile);
         $config->set('mobile.rgroups', $mobile_groups);
     }
     /**
      * Referrer tab
      */
     if ($this->_page == 'w3tc_referrer') {
         $groups = W3_Request::get_array('referrer_groups');
         $referrer_groups = array();
         foreach ($groups as $group => $group_config) {
             $group = strtolower($group);
             $group = preg_replace('~[^0-9a-z_]+~', '_', $group);
             $group = trim($group, '_');
             if ($group) {
                 $theme = isset($group_config['theme']) ? trim($group_config['theme']) : 'default';
                 $enabled = isset($group_config['enabled']) ? (bool) $group_config['enabled'] : true;
                 $redirect = isset($group_config['redirect']) ? trim($group_config['redirect']) : '';
                 $referrers = isset($group_config['referrers']) ? explode("\r\n", trim($group_config['referrers'])) : array();
                 $referrer_groups[$group] = array('theme' => $theme, 'enabled' => $enabled, 'redirect' => $redirect, 'referrers' => $referrers);
             }
         }
         /**
          * Allow plugins modify W3TC referrer groups
          */
         $referrer_groups = apply_filters('w3tc_referrer_groups', $referrer_groups);
         /**
          * Sanitize mobile groups
          */
         foreach ($referrer_groups as $group => $group_config) {
             $referrer_groups[$group] = array_merge(array('theme' => '', 'enabled' => true, 'redirect' => '', 'referrers' => array()), $group_config);
             $referrer_groups[$group]['referrers'] = array_unique($referrer_groups[$group]['referrers']);
             $referrer_groups[$group]['referrers'] = array_map('strtolower', $referrer_groups[$group]['referrers']);
             sort($referrer_groups[$group]['referrers']);
         }
         $enable_referrer = false;
         foreach ($referrer_groups as $group => $group_config) {
             if ($group_config['enabled']) {
                 $enable_referrer = true;
                 break;
             }
         }
         $config->set('referrer.enabled', $enable_referrer);
         $config->set('referrer.rgroups', $referrer_groups);
     }
     /**
      * CDN tab
      */
     if ($this->_page == 'w3tc_cdn') {
         $cdn_cnames = W3_Request::get_array('cdn_cnames');
         $cdn_domains = array();
         foreach ($cdn_cnames as $cdn_cname) {
             $cdn_cname = trim($cdn_cname);
             /**
              * Auto expand wildcard domain to 10 subdomains
              */
             $matches = null;
             if (preg_match('~^\\*\\.(.*)$~', $cdn_cname, $matches)) {
                 $cdn_domains = array();
                 for ($i = 1; $i <= 10; $i++) {
                     $cdn_domains[] = sprintf('cdn%d.%s', $i, $matches[1]);
                 }
                 break;
             }
             if ($cdn_cname) {
                 $cdn_domains[] = $cdn_cname;
             }
         }
         switch ($this->_config->get_string('cdn.engine')) {
             case 'ftp':
                 $config->set('cdn.ftp.domain', $cdn_domains);
                 break;
             case 's3':
                 $config->set('cdn.s3.cname', $cdn_domains);
                 break;
             case 'cf':
                 $config->set('cdn.cf.cname', $cdn_domains);
                 break;
             case 'cf2':
                 $config->set('cdn.cf2.cname', $cdn_domains);
                 break;
             case 'rscf':
                 $config->set('cdn.rscf.cname', $cdn_domains);
                 break;
             case 'azure':
                 $config->set('cdn.azure.cname', $cdn_domains);
                 break;
             case 'mirror':
                 $config->set('cdn.mirror.domain', $cdn_domains);
                 break;
             case 'maxcdn':
                 $config->set('cdn.maxcdn.domain', $cdn_domains);
                 break;
             case 'netdna':
                 $config->set('cdn.netdna.domain', $cdn_domains);
                 break;
             case 'cotendo':
                 $config->set('cdn.cotendo.domain', $cdn_domains);
                 break;
             case 'edgecast':
                 $config->set('cdn.edgecast.domain', $cdn_domains);
                 break;
             case 'att':
                 $config->set('cdn.att.domain', $cdn_domains);
                 break;
             case 'akamai':
                 $config->set('cdn.akamai.domain', $cdn_domains);
                 break;
         }
     }
     if ($this->_page == 'w3tc_extensions') {
         $extension = W3_Request::get_string('extension');
         $extensions = w3_get_extensions($this->_config);
         if (array_key_exists($extension, $extensions)) {
             $extension_values = W3_Request::get_as_array('extensions.settings.');
             $old_extensions = $this->_config->get_array('extensions.settings');
             $extension_keys = array();
             $extension_settings = array();
             $tmp_grp = str_replace('.', '_', $extension) . '_';
             foreach ($extension_values as $key => $value) {
                 if (strpos($key, $tmp_grp) !== false) {
                     $extension_settings[str_replace($tmp_grp, '', $key)] = $value;
                 }
             }
             $old_extension_settings = isset($old_extensions[$extension]) ? $old_extensions[$extension] : array();
             $extension_keys[$extension] = apply_filters("w3tc_save_extension_settings-{$extension}", $extension_settings, $old_extension_settings);
             $config->set("extensions.settings", array_merge($old_extensions, $extension_keys));
         }
     }
     $config = apply_filters('w3tc_save_options', $config, $this->_config, $config_admin);
     $config = apply_filters("w3tc_save_options-{$this->_page}", $config, $this->_config, $config_admin);
     do_action('w3tc_saving_options', $config, $this->_config, $config_admin);
     do_action("w3tc_saving_options-{$this->_page}", $config, $this->_config, $config_admin);
     w3_require_once(W3TC_INC_FUNCTIONS_DIR . '/admin.php');
     w3_config_save($this->_config, $config, $config_admin);
     switch ($this->_page) {
         case 'w3tc_cdn':
             /**
              * Handle Set Cookie Domain
              */
             $set_cookie_domain_old = W3_Request::get_boolean('set_cookie_domain_old');
             $set_cookie_domain_new = W3_Request::get_boolean('set_cookie_domain_new');
             if ($set_cookie_domain_old != $set_cookie_domain_new) {
                 if ($set_cookie_domain_new) {
                     if (!$this->enable_cookie_domain()) {
                         w3_admin_redirect(array_merge($params, array('w3tc_error' => 'enable_cookie_domain')));
                     }
                 } else {
                     if (!$this->disable_cookie_domain()) {
                         w3_admin_redirect(array_merge($params, array('w3tc_error' => 'disable_cookie_domain')));
                     }
                 }
             }
             break;
         case 'w3tc_general':
             /**
              * Handle CloudFlare changes
              */
             if ($this->_config->get_boolean('cloudflare.enabled') && (w3_get_blog_id() == 0 || w3_get_blog_id() != 0 && !$this->is_sealed('cloudflare'))) {
                 /**
                  * @var $w3_cloudflare W3_CloudFlare
                  */
                 $w3_cloudflare = w3_instance('W3_CloudFlare');
                 W3_CloudFlare::clear_last_error('');
                 $cf_values = W3_Request::get_as_array('cloudflare_');
                 if (!$w3_cloudflare->save_settings($cf_values)) {
                     w3_admin_redirect(array_merge($params, array('w3tc_error' => 'cloudflare_api_request')));
                 }
             }
             break;
     }
     $notes[] = 'config_save';
     if ($redirect_permalink_error) {
         w3_admin_redirect(array('w3tc_error' => $redirect_permalink_error, 'w3tc_note' => 'config_save'));
     }
     w3_admin_redirect_with_custom_messages($params, null, $notes, true);
 }