WordPress.org

Plugin Directory

Changeset 699041


Ignore:
Timestamp:
04/17/13 11:55:40 (12 months ago)
Author:
fredericktownes
Message:

CloudFlare and mfunc security patches.

Location:
w3-total-cache
Files:
524 added
15 edited

Legend:

Unmodified
Added
Removed
  • w3-total-cache/trunk/inc/define.php

    r665512 r699041  
    66 
    77define('W3TC', true); 
    8 define('W3TC_VERSION', '0.9.2.8'); 
     8define('W3TC_VERSION', '0.9.2.9'); 
    99define('W3TC_POWERED_BY', 'W3 Total Cache/' . W3TC_VERSION); 
    1010define('W3TC_EMAIL', 'w3tc@w3-edge.com'); 
     
    122122    $site_url_ssl = w3_get_url_ssl(w3_get_home_url()); 
    123123 
    124     $content_path = trim(substr(WP_CONTENT_DIR, strlen(w3_get_document_root())), '/'); 
    125  
    126     $url = $site_url_ssl . '/' . $content_path . $uri_from_wp_content; 
     124    $dir = ''; 
     125    if (substr(WP_CONTENT_DIR, 0, strlen(w3_get_site_root())) == w3_get_site_root()) { 
     126        $dir = str_replace($site_url_ssl, '', w3_get_url_ssl(w3_get_site_url())); 
     127        $dir = trim($dir, '/'); 
     128        if ($dir) 
     129            $dir = '/' . $dir; 
     130        $content_path = trim(substr(WP_CONTENT_DIR, strlen(w3_get_site_root())), '/'); 
     131    } 
     132    else 
     133        $content_path = trim(substr(WP_CONTENT_DIR, strlen(w3_get_document_root())), '/'); 
     134 
     135    $url = $site_url_ssl . $dir . '/' . $content_path . $uri_from_wp_content; 
    127136 
    128137    return $url; 
  • w3-total-cache/trunk/inc/options/general.php

    r663605 r699041  
    553553                </td> 
    554554            </tr> 
    555             <?php if ($this->is_network_and_master()): ?> 
     555            <?php if ($this->is_network_and_master() && !w3_force_master()): ?> 
    556556                <tr> 
    557557                    <th>Network policy:</th> 
  • w3-total-cache/trunk/languages/faq-en_US.xml

    r664104 r699041  
    496496</p> 
    497497            ]]></answer> 
     498        </entry> 
     499        <entry> 
     500            <question><![CDATA[ How do I implement page fragment caching? ]]></question> 
     501            <answer><![CDATA[ 
     502                <p>First you need to define W3TC_DYNAMIC_SECURITY in your wp-config.php file.</p> 
     503                <pre> 
     504define('W3TC_DYNAMIC_SECURITY', 'somesecurestring'); 
     505                </pre> 
     506                <p>Edit your templates with the following syntax to ensure that dynamic features remain so. Replace <W3TC_DYNAMIC_SECURITY> with content of the constant:</p> 
     507                <ul> 
     508                 <li>Example 1:<br />&lt;!-- mfunc {the W3TC_DYNAMIC_SECURITY string} any PHP code --&gt;&lt;!-- /mfunc {the W3TC_DYNAMIC_SECURITY string} --&gt;</li> 
     509                  <li>Example 2:<br />&lt;!-- mfunc {the W3TC_DYNAMIC_SECURITY string} --&gt;any PHP code&lt;!-- /mfunc {the W3TC_DYNAMIC_SECURITY string} --&gt;</li> 
     510                 <li>Example 3:<br />&lt;!--MFUNC {the W3TC_DYNAMIC_SECURITY string}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo rand();<br />&lt;!--/mfunc {the W3TC_DYNAMIC_SECURITY string} --&gt;</li> 
     511                  <li>Example 4:<br />&lt;!-- mclude {the W3TC_DYNAMIC_SECURITY string} path/to/file.php --&gt;&lt;!-- /mclude {the W3TC_DYNAMIC_SECURITY string} --&gt;</li> 
     512                  <li>Example 5:<br />&lt;!-- mclude {the W3TC_DYNAMIC_SECURITY string} --&gt;path/to/file.php&lt;!-- /mclude {the W3TC_DYNAMIC_SECURITY string} --&gt;</li> 
     513               </ul> 
     514               <p>Be aware that WordPress functions will not be available.</p> 
     515              ]]></answer> 
    498516        </entry> 
    499517        <entry> 
  • w3-total-cache/trunk/lib/W3/CloudFlare.php

    r663605 r699041  
    6363    function api_request($action, $value = null) { 
    6464        w3_require_once(W3TC_INC_DIR . '/functions/http.php'); 
     65        if (empty($this->_cf_config['email']) || !filter_var($this->_cf_config['email'], FILTER_VALIDATE_EMAIL)) 
     66            return false; 
     67 
     68        if (empty($this->_cf_config['key']) || !is_string($this->_cf_config['key'])) 
     69            return false; 
     70 
     71        if (empty($this->_cf_config['zone']) || !is_string($this->_cf_config['zone']) || strpos($this->_cf_config['zone'], '.') === false) 
     72            return false; 
    6573 
    6674        $url = sprintf('%s?email=%s&tkn=%s&z=%s&a=%s', W3TC_CLOUDFLARE_API_URL, urlencode($this->_cf_config['email']), urlencode($this->_cf_config['key']), urlencode($this->_cf_config['zone']), urlencode($action)); 
     
    97105    function external_event($type, $value) { 
    98106        w3_require_once(W3TC_INC_DIR . '/functions/http.php'); 
    99  
     107        if (empty($this->_cf_config['email']) || !filter_var($this->_cf_config['email'], FILTER_VALIDATE_EMAIL)) 
     108            return false; 
     109 
     110        if (empty($this->_cf_config['key']) || !is_string($this->_cf_config['key'])) 
     111            return false; 
     112             
     113        if ($this->get_last_error()) 
     114            return false; 
     115             
    100116        $url = sprintf('%s?u=%s&tkn=%s&evnt_t=%s&evnt_v=%s', W3TC_CLOUDFLARE_EXTERNAL_EVENT_URL, urlencode($this->_cf_config['email']), urlencode($this->_cf_config['key']), urlencode($type), urlencode($value)); 
    101117        $response = w3_http_get($url); 
     
    114130     */ 
    115131    function fix_remote_addr() { 
    116         if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) { 
     132        if (isset($_SERVER['HTTP_CF_CONNECTING_IP']) && !empty($_SERVER['HTTP_CF_CONNECTING_IP'])) { 
    117133            w3_require_once(W3TC_INC_DIR . '/functions/ip_in_range.php'); 
    118134            if (strpos($_SERVER["REMOTE_ADDR"], ":") === FALSE) { 
     
    151167    /** 
    152168     * Check 
     169     * @throws FilesystemOperationException 
     170     * @throws FileOperationException 
    153171     */ 
    154172    public function update_ip_ranges() { 
  • w3-total-cache/trunk/lib/W3/PgCache.php

    r664104 r699041  
    13861386    /** 
    13871387     * Parses dynamic tags 
    1388      * @return string 
    13891388     */ 
    13901389    function _parse_dynamic(&$buffer) { 
    1391         $buffer = preg_replace_callback('~<!--\s*mfunc(.*)-->(.*)<!--\s*/mfunc\s*-->~Uis', array( 
     1390        if (!defined('W3TC_DYNAMIC_SECURITY')) 
     1391            return; 
     1392        $buffer = preg_replace_callback('~<!--\s*mfunc\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->(.*)<!--\s*/mfunc\s*' . W3TC_DYNAMIC_SECURITY . '\s*-->~Uis', array( 
    13921393            &$this, 
    13931394            '_parse_dynamic_mfunc' 
    13941395        ), $buffer); 
    13951396 
    1396         $buffer = preg_replace_callback('~<!--\s*mclude(.*)-->(.*)<!--\s*/mclude\s*-->~Uis', array( 
     1397        $buffer = preg_replace_callback('~<!--\s*mclude\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->(.*)<!--\s*/mclude\s*' . W3TC_DYNAMIC_SECURITY . '\s*-->~Uis', array( 
    13971398            &$this, 
    13981399            '_parse_dynamic_mclude' 
     
    14641465     */ 
    14651466    function _has_dynamic(&$buffer) { 
    1466         return preg_match('~<!--\s*m(func|clude)(.*)-->(.*)<!--\s*/m(func|clude)\s*-->~Uis', $buffer); 
     1467        if (!defined('W3TC_DYNAMIC_SECURITY')) 
     1468            return false; 
     1469        return preg_match('~<!--\s*m(func|clude)\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->(.*)<!--\s*/m(func|clude)\s*' . W3TC_DYNAMIC_SECURITY . '\s*-->~Uis', $buffer); 
    14671470    } 
    14681471 
  • w3-total-cache/trunk/lib/W3/Plugin/CloudFlare.php

    r663605 r699041  
    1414 */ 
    1515class W3_Plugin_CloudFlare extends W3_Plugin{ 
    16  
    1716    /** 
    1817     * Runs plugin 
    1918     */ 
    2019    function run() { 
    21         if (is_admin()) { 
    22             $this->check_ip_versions(); 
    23             $this->get_admin()->run(); 
    24         } 
    2520        add_action('wp_set_comment_status', array($this, 'set_comment_status'), 1, 2); 
    26     } 
    27  
    28     /** 
    29      * @return array 
    30      */ 
    31     function deactivate() { 
    32         return $this->get_admin()->deactivate(); 
    33     } 
    34  
    35     /** 
    36      * Get the corresponding Admin plugin for the module 
    37      * 
    38      * @return W3_Plugin_CloudFlareAdmin 
    39      */ 
    40     function get_admin() { 
    41         return w3_instance('W3_Plugin_CloudFlareAdmin'); 
    42     } 
    43  
    44     /** 
    45      * Check if last check has expired. If so update CloudFlare ips 
    46      */ 
    47     function check_ip_versions() { 
    48         $checked = get_transient('w3tc_cloudflare_ip_check'); 
    49  
    50         if (false === $checked) { 
    51             $cf = w3_instance('W3_CloudFlare'); 
    52             $cf->update_ip_ranges(); 
    53             set_transient('w3tc_cloudflare_ip_check', time(), 3600*24); 
    54         } 
    5521    } 
    5622 
  • w3-total-cache/trunk/lib/W3/Plugin/CloudFlareAdmin.php

    r663605 r699041  
    1414 */ 
    1515class W3_Plugin_CloudFlareAdmin extends W3_Plugin{ 
     16    function run() { 
     17        $this->check_ip_versions(); 
    1618 
    17     function run() { 
     19        w3_require_once(W3TC_LIB_W3_DIR . '/Request.php'); 
     20        $page = W3_Request::get_string('page'); 
     21        if ($page && strpos($page, 'w3tc_') !== false) { 
     22            /** 
     23             * Only admin can see W3TC notices and errors 
     24             */ 
     25            add_action('admin_notices', array( 
     26                &$this, 
     27                'admin_notices' 
     28            )); 
     29            add_action('network_admin_notices', array( 
     30                &$this, 
     31                'admin_notices' 
     32            )); 
     33        } 
     34        add_action('wp_ajax_w3tc_cloudflare_api_request', array($this, 'action_cloudflare_api_request')); 
    1835 
    19         /** 
    20          * Only admin can see W3TC notices and errors 
    21          */ 
    22         add_action('admin_notices', array( 
    23             &$this, 
    24             'admin_notices' 
    25         )); 
    26         add_action('network_admin_notices', array( 
    27             &$this, 
    28             'admin_notices' 
    29         )); 
    3036    } 
    3137 
    3238    /** 
    33      * @return array|void 
     39     * Check if last check has expired. If so update CloudFlare ips 
    3440     */ 
    35     function deactivate() { 
    36         /** 
    37          * @var $dispatcher W3_Dispatcher 
    38          */ 
    39         $dispatcher = w3_instance('W3_Dispatcher'); 
    40         return $dispatcher->remove_cloudflare_rules_with_message(); 
    41     } 
     41    function check_ip_versions() { 
     42        $checked = get_transient('w3tc_cloudflare_ip_check'); 
    4243 
    43     /** 
    44      * Returns required rules for module 
    45      * @return array 
    46      */ 
    47     function get_required_rules() { 
    48         /** 
    49          * @var $dispatcher W3_Dispatcher 
    50          */ 
    51         $dispatcher = w3_instance('W3_Dispatcher'); 
    52         return $dispatcher->get_required_rules_for_cloudflare(); 
     44        if (false === $checked) { 
     45            $cf = w3_instance('W3_CloudFlare'); 
     46            try { 
     47                $cf->update_ip_ranges(); 
     48            } catch (Exception $ex) {} 
     49            set_transient('w3tc_cloudflare_ip_check', time(), 3600*24); 
     50        } 
    5351    } 
    5452 
    5553    function admin_notices() { 
    5654        $plugins = get_plugins(); 
    57         if (array_key_exists('cloudflare/cloudflare.php', $plugins)) 
    58             echo sprintf('<div class="error"><p>%s</p></div>', __('CloudFlare plugin detected. We recommend removing the 
    59             plugin as it offers no additional capabilities when W3 Total Cache is installed. This message will disappear 
    60             when CloudFlare is removed.', 'w3-total-cache')); 
     55        if (array_key_exists('cloudflare/cloudflare.php', $plugins) && $this->_config->get_boolean('notes.cloudflare_plugin')) { 
     56            w3_require_once(W3TC_INC_FUNCTIONS_DIR . '/other.php'); 
     57            echo sprintf('<div class="error"><p>%s %s</p></div>', __('The CloudFlare plugin is detected. Please note that CloudFlare should only be administered from either CloudFlare or W3 Total Cache in order to avoid confusion. Either can work, but make changes from only a single place while testing. Also note, CloudFlare support may be discontinued in the future., 'w3-total-cache'), 
     58                w3tc_button_hide_note('Hide this message', 'cloudflare_plugin') 
     59            ); 
     60        } 
     61    } 
     62 
     63 
     64    /** 
     65     * Send CloudFlare API request 
     66     * 
     67     * @return void 
     68     */ 
     69    function action_cloudflare_api_request() { 
     70        $result = false; 
     71        $response = null; 
     72 
     73        $actions = array( 
     74            'devmode', 
     75            'sec_lvl', 
     76            'fpurge_ts' 
     77        ); 
     78 
     79        w3_require_once(W3TC_LIB_W3_DIR . '/Request.php'); 
     80 
     81        $email = W3_Request::get_string('email'); 
     82        $key = W3_Request::get_string('key'); 
     83        $zone = W3_Request::get_string('zone'); 
     84        $action = W3_Request::get_string('command'); 
     85        $value = W3_Request::get_string('value'); 
     86        $nonce = W3_Request::get_string('_wpnonce'); 
     87 
     88        if ( !wp_verify_nonce( $nonce, 'w3tc' ) ) die('not allowed');  
     89 
     90        if (!$email) { 
     91            $error = 'Empty email.'; 
     92        } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     93            $error = 'Invalid email.'; 
     94        } elseif (!$key) { 
     95            $error = 'Empty key.'; 
     96        } elseif (!$zone) { 
     97            $error = 'Empty zone.'; 
     98        } elseif (strpos($zone, '.') === false) { 
     99            $error = 'Invalid domain.'; 
     100        } elseif (!in_array($action, $actions)) { 
     101            $error = 'Invalid action.'; 
     102        } else { 
     103            $config = array( 
     104                'email' => $email, 
     105                'key' => $key, 
     106                'zone' => $zone 
     107            ); 
     108 
     109            w3_require_once(W3TC_LIB_W3_DIR . '/CloudFlare.php'); 
     110            @$w3_cloudflare = new W3_CloudFlare($config); 
     111 
     112            @set_time_limit($this->_config->get_integer('timelimit.cloudflare_api_request')); 
     113 
     114            $response = $w3_cloudflare->api_request($action, $value); 
     115 
     116            if ($response) { 
     117                if ($response->result == 'success') { 
     118                    $result = true; 
     119                    $error = 'OK'; 
     120                } else { 
     121                    $error = $response->msg; 
     122                } 
     123            } else { 
     124                $error = 'Unable to make CloudFlare API request.'; 
     125            } 
     126        } 
     127 
     128        $return = array( 
     129            'result' => $result, 
     130            'error' => $error, 
     131            'response' => $response 
     132        ); 
     133 
     134        echo json_encode($return); 
     135        exit; 
    61136    } 
    62137} 
  • w3-total-cache/trunk/lib/W3/Plugin/DbCache.php

    r663605 r699041  
    3737        add_action('wp_trash_post', array( 
    3838            &$this, 
    39             'on_change' 
     39            'on_post_change' 
    4040        ), 0); 
    4141 
    4242        add_action('save_post', array( 
    4343            &$this, 
    44             'on_change' 
     44            'on_post_change' 
    4545        ), 0); 
    4646 
     
    4949            add_action('clean_post_cache', array( 
    5050            &$this, 
    51             'on_change' 
     51            'on_post_change' 
    5252            ), 0, 2); 
    5353        } 
     
    5555        add_action('comment_post', array( 
    5656            &$this, 
    57             'on_change' 
     57            'on_comment_change' 
    5858        ), 0); 
    5959 
    6060        add_action('edit_comment', array( 
    6161            &$this, 
    62             'on_change' 
     62            'on_comment_change' 
    6363        ), 0); 
    6464 
    6565        add_action('delete_comment', array( 
    6666            &$this, 
    67             'on_change' 
     67            'on_comment_change' 
    6868        ), 0); 
    6969 
    7070        add_action('wp_set_comment_status', array( 
    7171            &$this, 
    72             'on_change' 
    73         ), 0); 
     72            'on_comment_status' 
     73        ), 0, 2); 
    7474 
    7575        add_action('trackback_post', array( 
    7676            &$this, 
    77             'on_change' 
     77            'on_comment_change' 
    7878        ), 0); 
    7979 
    8080        add_action('pingback_post', array( 
    8181            &$this, 
    82             'on_change' 
     82            'on_comment_change' 
    8383        ), 0); 
    8484 
     
    102102        add_action('delete_post', array( 
    103103            &$this, 
    104             'on_change' 
     104            'on_post_change' 
    105105        ), 0); 
    106106    } 
     
    169169        } 
    170170    } 
    171      
     171     
    172172    /** 
    173173     * Does disk cache cleanup 
     
    206206     * Change action 
    207207     */ 
    208     function on_change($post_id = 0, $post = null) { 
     208    function on_change() { 
     209        static $flushed = false; 
     210 
     211        if (!$flushed) { 
     212            $flusher = w3_instance('W3_CacheFlush'); 
     213            $flusher->dbcache_flush(); 
     214 
     215            $flushed = true; 
     216        } 
     217    } 
     218 
     219    /** 
     220     * Change post action 
     221     */ 
     222    function on_post_change($post_id = 0, $post = null) { 
    209223        static $flushed = false; 
    210224 
     
    223237        } 
    224238    } 
     239 
     240    /** 
     241     * Comment change action 
     242     * 
     243     * @param integer $comment_id 
     244     */ 
     245    function on_comment_change($comment_id) { 
     246        $post_id = 0; 
     247 
     248        if ($comment_id) { 
     249            $comment = get_comment($comment_id, ARRAY_A); 
     250            $post_id = !empty($comment['comment_post_ID']) ? (int) $comment['comment_post_ID'] : 0; 
     251        } 
     252 
     253        $this->on_post_change($post_id); 
     254    } 
     255 
     256    /** 
     257     * Comment status action 
     258     * 
     259     * @param integer $comment_id 
     260     * @param string $status 
     261     */ 
     262    function on_comment_status($comment_id, $status) { 
     263        if ($status === 'approve' || $status === '1') { 
     264            $this->on_comment_change($comment_id); 
     265        } 
     266    } 
    225267} 
  • w3-total-cache/trunk/lib/W3/Plugin/ObjectCache.php

    r663605 r699041  
    3737        add_action('wp_trash_post', array( 
    3838            &$this, 
    39             'on_change' 
     39            'on_post_change' 
    4040        ), 0); 
    4141 
    4242        add_action('save_post', array( 
    4343            &$this, 
    44             'on_change' 
     44            'on_post_change' 
    4545        ), 0); 
    4646 
     
    4949            add_action('clean_post_cache', array( 
    5050                &$this, 
    51                 'on_change' 
     51                'on_post_change' 
    5252            ), 0, 2); 
    5353        } 
     
    5555        add_action('comment_post', array( 
    5656            &$this, 
    57             'on_change' 
     57            'on_comment_change' 
    5858        ), 0); 
    5959 
    6060        add_action('edit_comment', array( 
    6161            &$this, 
    62             'on_change' 
     62            'on_comment_change' 
    6363        ), 0); 
    6464 
    6565        add_action('delete_comment', array( 
    6666            &$this, 
    67             'on_change' 
     67            'on_comment_change' 
    6868        ), 0); 
    6969 
    7070        add_action('wp_set_comment_status', array( 
    7171            &$this, 
    72             'on_change' 
    73         ), 0); 
     72            'on_comment_status' 
     73        ), 0, 2); 
    7474 
    7575        add_action('trackback_post', array( 
    7676            &$this, 
    77             'on_change' 
     77            'on_comment_change' 
    7878        ), 0); 
    7979 
    8080        add_action('pingback_post', array( 
    8181            &$this, 
    82             'on_change' 
     82            'on_comment_change' 
    8383        ), 0); 
    8484 
     
    116116        add_action('delete_post', array( 
    117117            &$this, 
    118             'on_change' 
     118            'on_post_change' 
    119119        ), 0); 
    120120    } 
     
    199199     * Change action 
    200200     */ 
    201     function on_change($post_id = 0, $post = null) { 
     201    function on_change() { 
     202        static $flushed = false; 
     203 
     204        if (!$flushed) { 
     205            $flush = w3_instance('W3_CacheFlush'); 
     206            $flush->objectcache_flush(); 
     207            $flushed = true; 
     208        } 
     209    } 
     210 
     211    /** 
     212     * Change post action 
     213     */ 
     214    function on_post_change($post_id = 0, $post = null) { 
    202215        static $flushed = false; 
    203216 
     
    261274        $o->switch_blog($blog_id); 
    262275    } 
     276 
     277 
     278    /** 
     279     * Comment change action 
     280     * 
     281     * @param integer $comment_id 
     282     */ 
     283    function on_comment_change($comment_id) { 
     284        $post_id = 0; 
     285 
     286        if ($comment_id) { 
     287            $comment = get_comment($comment_id, ARRAY_A); 
     288            $post_id = !empty($comment['comment_post_ID']) ? (int) $comment['comment_post_ID'] : 0; 
     289        } 
     290 
     291        $this->on_post_change($post_id); 
     292    } 
     293 
     294    /** 
     295     * Comment status action 
     296     * 
     297     * @param integer $comment_id 
     298     * @param string $status 
     299     */ 
     300    function on_comment_status($comment_id, $status) { 
     301        if ($status === 'approve' || $status === '1') { 
     302            $this->on_comment_change($comment_id); 
     303        } 
     304    } 
    263305} 
  • w3-total-cache/trunk/lib/W3/Plugin/TotalCache.php

    r663605 r699041  
    8282         */ 
    8383        if ($this->_config->get_boolean('cloudflare.enabled')) { 
    84             add_action('wp_set_comment_status', array( 
    85                 &$this, 
    86                 'cloudflare_set_comment_status' 
    87             ), 1, 2); 
    88  
    8984            w3_require_once(W3TC_LIB_W3_DIR . '/CloudFlare.php'); 
    9085            @$w3_cloudflare = new W3_CloudFlare(); 
    91  
    9286            $w3_cloudflare->fix_remote_addr(); 
    93  
    9487        } 
    9588 
     
    140133     */ 
    141134    function init() { 
     135        if (is_multisite()) { 
     136            global $w3_current_blog_id, $current_blog; 
     137            if ($w3_current_blog_id != $current_blog->blog_id && !isset($GLOBALS['w3tc_blogmap_register_new_item'])) { 
     138                $url = w3_get_host() . $_SERVER['REQUEST_URI']; 
     139                $pos = strpos($url, '?'); 
     140                if ($pos !== false) 
     141                    $url = substr($url, 0, $pos); 
     142                $GLOBALS['w3tc_blogmap_register_new_item'] = $url; 
     143            } 
     144        } 
     145 
    142146        if (isset($GLOBALS['w3tc_blogmap_register_new_item'])) { 
    143147            $do_redirect = false; 
  • w3-total-cache/trunk/lib/W3/Plugin/TotalCacheAdmin.php

    r665512 r699041  
    48074807 
    48084808    /** 
    4809      * Send CloudFlare API request 
    4810      * 
    4811      * @return void 
    4812      */ 
    4813     function action_cloudflare_api_request() { 
    4814         $result = false; 
    4815         $response = null; 
    4816  
    4817         $actions = array( 
    4818             'devmode', 
    4819             'sec_lvl', 
    4820             'fpurge_ts' 
    4821         ); 
    4822  
    4823         w3_require_once(W3TC_LIB_W3_DIR . '/Request.php'); 
    4824  
    4825         $email = W3_Request::get_string('email'); 
    4826         $key = W3_Request::get_string('key'); 
    4827         $zone = W3_Request::get_string('zone'); 
    4828         $action = W3_Request::get_string('action'); 
    4829         $value = W3_Request::get_string('value'); 
    4830  
    4831         if (!$email) { 
    4832             $error = 'Empty email.'; 
    4833         } elseif (!$key) { 
    4834             $error = 'Empty key.'; 
    4835         } elseif (!$zone) { 
    4836             $error = 'Empty zone.'; 
    4837         } elseif (!in_array($action, $actions)) { 
    4838             $error = 'Invalid action.'; 
    4839         } else { 
    4840             $config = array( 
    4841                 'email' => $email, 
    4842                 'key' => $key, 
    4843                 'zone' => $zone 
    4844             ); 
    4845  
    4846             w3_require_once(W3TC_LIB_W3_DIR . '/CloudFlare.php'); 
    4847             @$w3_cloudflare = new W3_CloudFlare($config); 
    4848  
    4849             @set_time_limit($this->_config->get_integer('timelimit.cloudflare_api_request')); 
    4850  
    4851             $response = $w3_cloudflare->api_request($action, $value); 
    4852  
    4853             if ($response) { 
    4854                 if ($response->result == 'success') { 
    4855                     $result = true; 
    4856                     $error = 'OK'; 
    4857                 } else { 
    4858                     $error = $response->msg; 
    4859                 } 
    4860             } else { 
    4861                 $error = 'Unable to make CloudFlare API request.'; 
    4862             } 
    4863         } 
    4864  
    4865         $return = array( 
    4866             'result' => $result, 
    4867             'error' => $error, 
    4868             'response' => $response 
    4869         ); 
    4870  
    4871         echo json_encode($return); 
    4872     } 
    4873  
    4874     /** 
    48754809     * Self test action 
    48764810     */ 
     
    55845518    } 
    55855519 
    5586     /** 
     5520   /** 
    55875521     * Purge the CloudFlare cache 
    55885522     * @return void 
  • w3-total-cache/trunk/lib/W3/Plugins.php

    r665512 r699041  
    3434        ); 
    3535        if (is_admin()) { 
     36            $this->_plugins[] = array('class_name' => 'W3_Plugin_CloudFlareAdmin', 'enable_options' => 'cloudflare.enabled'); 
    3637            $this->_plugins[] = array('class_name' => 'W3_Plugin_TotalCacheAdmin', 'enable_options' => null); 
    3738            $this->_plugins[] = array('class_name' => 'W3_Plugin_NewRelicAdmin', 'enable_options' => null); 
  • w3-total-cache/trunk/pub/js/options.js

    r665512 r699041  
    116116} 
    117117 
     118function w3tc_minify_filename_test(url, success, failure) { 
     119    var timestamp = new Date().getTime(); 
     120    jQuery.get(url + '?t=' + timestamp, function (data) { 
     121        success(data, url); 
     122    }) 
     123    .fail(function (data) { 
     124        failure(data, url); 
     125    }); 
     126} 
     127function w3tc_minify_filename_test_once(url, filename) { 
     128    jQuery(function($) { 
     129        w3tc_minify_filename_test(url + filename + '.css', 
     130            function(data, url) { 
     131                if (data == 'retry') { 
     132                    $.get(url, function(data2) { 
     133                        if (data2 != 'content ok') { 
     134                            $('#minify_auto_error').show(); 
     135                            w3tc_start_minify_try_solve(); 
     136                        } else { 
     137                            $.get(ajaxurl, {action:'w3tc_minify_disable_filename_test'}); 
     138                        } 
     139                    }); 
     140                } else if (data != 'content ok') { 
     141                    $('#minify_auto_error').show(); 
     142                    w3tc_start_minify_try_solve(); 
     143                } 
     144            }, 
     145            function (data, url) { 
     146                $('#minify_auto_error').show(); 
     147                w3tc_start_minify_try_solve(); 
     148            } 
     149        ); 
     150    }) 
     151} 
     152 
     153function w3tc_filename_auto_solve(testUrl) { 
     154    var minLength = 100, maxLength = 246; 
     155    jQuery('#minify_auto_test_loading').toggleClass('minify_auto_test'); 
     156    w3tc_do_filename_auto_step(testUrl,minLength, maxLength, maxLength, false); 
     157} 
     158 
     159function w3tc_do_filename_auto_step(testUrl,minLength, maxLength, tryLength, minTestedAndSuccessful) { 
     160    tryLength = Math.floor(tryLength); 
     161    var testString = new Array(tryLength+1).join('X'); 
     162    var timestamp = new Date().getTime(); 
     163    var url = testUrl + testString + '.css' + '?t=' + timestamp; 
     164    jQuery.get(url, function (data) { 
     165        if (data == 'retry') { 
     166            jQuery.get(url, function (retryResult) { 
     167                if (retryResult == 'content ok') { 
     168                    w3tc_do_success(testUrl,minLength, maxLength, tryLength, minTestedAndSuccessful); 
     169                } else { 
     170                    jQuery.get(ajaxurl, {action:'w3tc_minify_disable_filename_test'}); 
     171                    alert('Plugin could not solve the Minify Auto issue automatically.'); 
     172                    jQuery('#minify_auto_test_loading').toggleClass('minify_auto_test'); 
     173                    jQuery('#minify_auto_error').html('<p>Minify Auto does not work properly. Try using Minify Manual instead ' + 
     174                        'or try another  Minify cache method.</p>'); 
     175                } 
     176            }); 
     177        } else if (data == 'content ok') { 
     178            w3tc_do_success(testUrl,minLength, maxLength, tryLength, minTestedAndSuccessful); 
     179        } else { 
     180            w3tc_do_failure(testUrl,minLength, maxLength, tryLength, minTestedAndSuccessful); 
     181        } 
     182    }).fail(function (data) { 
     183            w3tc_do_failure(testUrl,minLength, maxLength, tryLength, minTestedAndSuccessful); 
     184    }); 
     185} 
     186 
     187function w3tc_do_success(testUrl,minLength, maxLength, tryLength, minTestedAndSuccessful) { 
     188    if ((maxLength - tryLength) < 10) { 
     189        w3tc_finish_with(tryLength); 
     190        return; 
     191    } 
     192    w3tc_do_filename_auto_step(testUrl, tryLength, maxLength, (tryLength + maxLength) / 2, true); 
     193} 
     194 
     195function w3tc_do_failure(testUrl,minLength, maxLength, tryLength, minTestedAndSuccessful) { 
     196    if ((tryLength - minLength) < 10) { 
     197        if (minTestedAndSuccessful) { 
     198            w3tc_finish_with(minLength); 
     199            return; 
     200        } else    if (tryLength <= minLength) { 
     201            jQuery.get(ajaxurl, {action:'w3tc_minify_disable_filename_test'}); 
     202            alert('Plugin could not solve the Minify Auto issue automatically.'); 
     203            jQuery('#minify_auto_test_loading').toggleClass('minify_auto_test'); 
     204            jQuery('#minify_auto_error').html('<p>Minify Auto does not work properly. Try using Minify Manual instead ' + 
     205                'or try another Minify cache method. You can also try a lower filename length value manually on ' + 
     206                '<a href="admin.php?page=w3tc_minify#advanced">settings page</a></p>'); 
     207            return; 
     208        } 
     209        else { 
     210            w3tc_do_filename_auto_step(testUrl,minLength, maxLength, minLength, false); 
     211            return; 
     212        } 
     213    } 
     214    w3tc_do_filename_auto_step(testUrl, minLength, maxLength, (tryLength + minLength) / 2, minTestedAndSuccessful); 
     215} 
     216 
     217function w3tc_finish_with(length) { 
     218    jQuery.get(ajaxurl, {action:'w3tc_minify_change_filename_length', maxlength: length}, function (changeResult) { 
     219        if (changeResult == 1) { 
     220            jQuery('#minify_auto_filename_length').val(length); 
     221            jQuery('#minify_auto_test_loading').toggleClass('minify_auto_test'); 
     222            alert('Minify Auto filename length changed too ' + length); 
     223            jQuery('#minify_auto_error').hide(); 
     224        } else { 
     225            jQuery('#minify_auto_test_loading').toggleClass('minify_auto_test'); 
     226            alert('Tried to change Minify Auto filename length too ' + length + ' but failed.'); 
     227            jQuery('#minify_auto_error').hide(); 
     228        } 
     229    }); 
     230 
     231} 
     232 
    118233function w3tc_cdn_get_cnames() { 
    119234    var cnames = []; 
     
    200315    } 
    201316 
    202     jQuery.post('admin.php?page=w3tc_general', { 
    203         w3tc_cloudflare_api_request: 1, 
     317    jQuery.post(ajaxurl, { 
     318        action:'w3tc_cloudflare_api_request', 
    204319        email: email.val(), 
    205320        key: key.val(), 
    206321        zone: zone.val(), 
    207         action: action, 
     322        command: action, 
    208323        value: value, 
    209324        _wpnonce: nonce 
     
    333448        window.open('http://wordpress.org/support/view/plugin-reviews/w3-total-cache?rate=5#postform', '_blank'); 
    334449    }); 
    335     jQuery('#w3tc_technical_info').hide(); 
    336     jQuery('#w3tc_read_technical_info').click(function() { 
    337         jQuery('#w3tc_technical_info').toggle(); 
     450    jQuery('.w3tc_read_technical_info').click(function() { 
     451        jQuery('.w3tc_technical_info').toggle(); 
    338452    }); 
    339453 
     
    14651579 
    14661580    // show hide missing files 
     1581    jQuery('.w3tc-show-ftp-form').click(function() { 
     1582        var btn = jQuery(this), rules = jQuery('.w3tc-ftp-form'); 
     1583 
     1584        if (rules.is(':visible')) { 
     1585            rules.css('display', 'none'); 
     1586            btn.val('Update via FTP'); 
     1587        } else { 
     1588            rules.css('display', 'block'); 
     1589            btn.val('Cancel FTP Update'); 
     1590        } 
     1591    }); 
     1592 
     1593    // show hide missing files 
    14671594    jQuery('.w3tc-show-technical-info').click(function() { 
    14681595        var btn = jQuery(this), info = jQuery('.w3tc-technical-info'); 
  • w3-total-cache/trunk/readme.txt

    r665512 r699041  
    1 === Plugin Name === 
     1=== Plugin Name === 
    22Contributors: fredericktownes 
    33Tags: wpo, web performance optimization, performance, availability, scaling, scalability, user experience, cache, caching, page cache, css cache, js cache, db cache, disk cache, disk caching, database cache, http compression, gzip, deflate, minify, cdn, content delivery network, media library, performance, speed, multiple hosts, css, merge, combine, unobtrusive javascript, compress, optimize, optimizer, javascript, js, cascading style sheet, plugin, yslow, yui, google, google rank, google page speed, mod_pagespeed, new relic, newrelic, aws, s3, cloudfront, sns, elasticache, rds, flash media server, amazon web services, cloud files, rackspace, akamai, max cdn, netdna, limelight, cloudflare, mod_cloudflare, microsoft, microsoft azure, iis, nginx, litespeed, apache, varnish, xcache, apc, eacclerator, wincache, mysql, w3 total cache, batcache, wp cache, wp super cache, quick cache, wp minify, bwp-minify, buddypress 
    44Requires at least: 2.8 
    55Tested up to: 3.5.1 
    6 Stable tag: 0.9.2.8 
     6Stable tag: 0.9.2.9 
    77License: GPLv2 or later 
    88License URI: http://www.gnu.org/licenses/gpl-2.0.html 
     
    732732 
    733733== Changelog == 
     734= 0.9.2.9 = 
     735* Fixed saving settings issue with CloudFlare on activation 
     736* Fixed issue with DbCache and Object Cache flushing 
     737* Improved security for CloudFlare API calls 
     738* Improved security for mfunc, now disabled by default and requires security string in order to execute 
     739* Improved behavior of GET string, used for detecting blogs in disk enhanced page caching mode for multi site to prevent redirect loops and other issues 
     740 
    734741= 0.9.2.8 = 
    735742* Fixed /tmp file creation issue when saving settings 
     
    12351242== Upgrade Notice == 
    12361243 
    1237 = 0.9.2.8 = 
    1238 Thanks for using W3 Total Cache! As always, this update is very strongly recommended. The recent releases attempted to use WordPress' built in support for managing files and folders and clearly has not worked. Since W3TC is a caching plugin, file management is a critical issue that will cause lots of issues if it doesn't work perfectly. This release is hopefully the last attempt to restore file management back to the reliability of previous versions (0.9.2.4 etc). We realize that having *any* problems is not acceptable, but caching means changing server behavior so while this plugin is still in pre-release we're trying to work on learning the lessons. 
     1244= 0.9.2.9 = 
     1245Thanks for using W3 Total Cache! As always, this update is very strongly recommended. This release addresses security issues for Cloudflare users as well as users that implement fragment caching via the mfunc functionality. For those using mfunc, temporarily disable page caching to allow yourself time to check the FAQ tab for new usage instructions; if you have a staging environment, that is the most convenient way to test prior to production roll out. 
  • w3-total-cache/trunk/w3-total-cache.php

    r665512 r699041  
    33Plugin Name: W3 Total Cache 
    44Description: The highest rated and most complete WordPress performance plugin. Dramatically improve the speed and user experience of your site. Add browser, page, object and database caching as well as minify and content delivery network (CDN) to WordPress. 
    5 Version: 0.9.2.8 
     5Version: 0.9.2.9 
    66Plugin URI: http://www.w3-edge.com/wordpress-plugins/w3-total-cache/ 
    77Author: Frederick Townes 
Note: See TracChangeset for help on using the changeset viewer.