349 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace W3TC;
 | |
| 
 | |
| class Extension_CloudFlare_Plugin_Admin {
 | |
| 	private $_config;
 | |
| 	private $api;
 | |
| 
 | |
| 	public static function w3tc_extensions( $extensions, $config ) {
 | |
| 		$current_user            = wp_get_current_user();
 | |
| 		$message                 = array();
 | |
| 		$message[]               = 'CloudFlare';
 | |
| 		$cloudflare_signup_email = '';
 | |
| 		$cloudflare_signup_user  = '';
 | |
| 
 | |
| 		if ( is_a( $current_user, 'WP_User' ) ) {
 | |
| 			if ( $current_user->user_email ) {
 | |
| 				$cloudflare_signup_email = $current_user->user_email;
 | |
| 			}
 | |
| 
 | |
| 			if ( $current_user->user_login && 'admin' !== $current_user->user_login ) {
 | |
| 				$cloudflare_signup_user = $current_user->user_login;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$extensions['cloudflare'] = array(
 | |
| 			'name'            => 'CloudFlare',
 | |
| 			'author'          => 'W3 EDGE',
 | |
| 			'description'     => wp_kses(
 | |
| 				sprintf(
 | |
| 					// translators:	1 opening HTML a tag to CloudFlare signup page with affiliate association, 2 closing HTML a tag,
 | |
| 					// translators: 3 opening HTML abbr tag, 4 closing HTML abbr tag,
 | |
| 					// translators: 5 opening HTML a tag to CloudFlare account page, 6 closing HTML a tag,
 | |
| 					// translators: 7 opening HTML a tag to CloudFlare help page, 8 closing HTML a tag.
 | |
| 					__(
 | |
| 						'CloudFlare protects and accelerates websites. %1$sSign up now for free%2$s to get started, or if you have an account simply log in to obtain your %3$sAPI%4$s token / global key from the %5$saccount page%6$s to enter it on the General Settings box that appears after plugin activation. Contact the CloudFlare %7$ssupport team%8$s with any questions.',
 | |
| 						'w3-total-cache'
 | |
| 					),
 | |
| 					'<a href="' . esc_url( 'https://www.cloudflare.com/sign-up.html?affiliate=w3edge&seed_domain=' . Util_Environment::host() . '&email=' . $cloudflare_signup_email . '&username=' . $cloudflare_signup_user ) . '" target="_blank">',
 | |
| 					'</a>',
 | |
| 					'<abbr title="' . esc_attr__( 'Application Programming Interface', 'w3-total-cache' ) . '">',
 | |
| 					'</abbr>',
 | |
| 					'<a target="_blank" href="https://www.cloudflare.com/my-account">',
 | |
| 					'</a>',
 | |
| 					'<a href="http://www.cloudflare.com/help.html" target="_blank">',
 | |
| 					'</a>'
 | |
| 				),
 | |
| 				array(
 | |
| 					'a'    => array(
 | |
| 						'href'   => array(),
 | |
| 						'target' => array(),
 | |
| 					),
 | |
| 					'abbr' => array(
 | |
| 						'title' => array(),
 | |
| 					),
 | |
| 				)
 | |
| 			),
 | |
| 			'author_uri'      => 'https://www.w3-edge.com/',
 | |
| 			'extension_uri'   => 'https://www.w3-edge.com/',
 | |
| 			'extension_id'    => 'cloudflare',
 | |
| 			'settings_exists' => true,
 | |
| 			'version'         => '0.3',
 | |
| 			'enabled'         => true,
 | |
| 			'requirements'    => implode( ', ', $message ),
 | |
| 			'path'            => 'w3-total-cache/Extension_CloudFlare_Plugin.php',
 | |
| 		);
 | |
| 
 | |
| 		return $extensions;
 | |
| 	}
 | |
| 
 | |
| 	function run() {
 | |
| 		$c             = Dispatcher::config();
 | |
| 		$this->api     = new Extension_CloudFlare_Api(
 | |
| 			array(
 | |
| 				'email'                 => $c->get_string( array( 'cloudflare', 'email' ) ),
 | |
| 				'key'                   => $c->get_string( array( 'cloudflare', 'key' ) ),
 | |
| 				'zone_id'               => $c->get_string( array( 'cloudflare', 'zone_id' ) ),
 | |
| 				'timelimit_api_request' => $c->get_integer( array( 'cloudflare', 'timelimit.api_request' ) ),
 | |
| 			)
 | |
| 		);
 | |
| 		$this->_config = $c;
 | |
| 
 | |
| 		add_filter( 'w3tc_dashboard_actions', array( $this, 'w3tc_dashboard_actions' ) );
 | |
| 
 | |
| 		$widget = new Extension_CloudFlare_Widget();
 | |
| 		$widget->init();
 | |
| 
 | |
| 		// modify settings page.
 | |
| 		add_filter( 'w3tc_ui_config_item_cdnfsd.enabled', array( $this, 'w3tc_ui_config_item_cdnfsd_enabled' ) );
 | |
| 		add_filter( 'w3tc_ui_config_item_cdnfsd.engine', array( $this, 'w3tc_ui_config_item_cdnfsd_engine' ) );
 | |
| 
 | |
| 		add_filter( 'w3tc_settings_general_anchors', array( $this, 'w3tc_settings_general_anchors' ) );
 | |
| 		add_action( 'w3tc_settings_general_boxarea_cloudflare', array( $this, 'w3tc_settings_general_boxarea_cloudflare' ) );
 | |
| 
 | |
| 		add_action( 'wp_ajax_w3tc_cloudflare_api_request', array( $this, 'action_cloudflare_api_request' ) );
 | |
| 
 | |
| 		// modify main menu.
 | |
| 		add_filter( 'w3tc_admin_bar_menu', array( $this, 'w3tc_admin_bar_menu' ) );
 | |
| 
 | |
| 		// dashboard.
 | |
| 		add_action( 'admin_print_scripts-toplevel_page_w3tc_dashboard', array( $this, 'admin_print_scripts_w3tc_dashboard' ) );
 | |
| 		add_filter( 'w3tc_admin_actions', array( $this, 'w3tc_admin_actions' ) );
 | |
| 
 | |
| 		// own settings page.
 | |
| 		add_action( 'w3tc_extension_page_cloudflare', array( '\W3TC\Extension_CloudFlare_Page', 'w3tc_extension_page_cloudflare' ) );
 | |
| 
 | |
| 		add_action( 'w3tc_ajax', array( '\W3TC\Extension_CloudFlare_Popup', 'w3tc_ajax' ) );
 | |
| 
 | |
| 		$cdnfsd_engine = $c->get_string( 'cdnfsd.engine' );
 | |
| 
 | |
| 		if ( empty( $cdnfsd_engine ) || 'cloudflare' === $cdnfsd_engine ) {
 | |
| 			add_action( 'w3tc_settings_box_cdnfsd', array( '\W3TC\Extension_CloudFlare_Page', 'w3tc_settings_box_cdnfsd' ) );
 | |
| 		}
 | |
| 
 | |
| 		// add notices about api health.
 | |
| 		if ( Util_Admin::is_w3tc_admin_page() ) {
 | |
| 			add_action( 'admin_notices', array( $this, 'admin_notices' ) );
 | |
| 			add_action( 'network_admin_notices', array( $this, 'admin_notices' ) );
 | |
| 		}
 | |
| 
 | |
| 		$this->check_ip_versions();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Admin notices.
 | |
| 	 */
 | |
| 	public function admin_notices() {
 | |
| 		$plugins = get_plugins();
 | |
| 		if ( array_key_exists( 'cloudflare/cloudflare.php', $plugins ) && $this->_config->get_boolean( 'notes.cloudflare_plugin' ) ) {
 | |
| 			echo wp_kses(
 | |
| 				sprintf(
 | |
| 					// translators: 1 opening HTML div tag with class "error" followed by opening HTML p tag,
 | |
| 					// translators: 2 HTML button with lable "Hide this message" that will hide the error message,
 | |
| 					// translators: 3 closing HTML p tag followed by closing HTML div tag.
 | |
| 					__(
 | |
| 						'%1$sCloudFlare plugin detected. We recommend removing the plugin as it offers no additional capabilities when W3 Total Cache is installed. This message will disappear when CloudFlare is removed. %2$s%3$s',
 | |
| 						'w3-total-cache'
 | |
| 					),
 | |
| 					'<div class="error"><p>',
 | |
| 					Util_Ui::button_hide_note( 'Hide this message', 'cloudflare_plugin' ),
 | |
| 					'</p></div>'
 | |
| 				),
 | |
| 				array(
 | |
| 					'div'   => array(
 | |
| 						'class' => array(),
 | |
| 					),
 | |
| 					'input' => array(
 | |
| 						'class'   => array(),
 | |
| 						'value'   => array(),
 | |
| 						'type'    => array(),
 | |
| 						'onclick' => array(),
 | |
| 					),
 | |
| 					'p'     => array(),
 | |
| 				)
 | |
| 			);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public function w3tc_admin_bar_menu( $menu_items ) {
 | |
| 		$menu_items['20810.cloudflare'] = array(
 | |
| 			'id'     => 'w3tc_flush_cloudflare',
 | |
| 			'parent' => 'w3tc_flush',
 | |
| 			'title'  => __( 'CloudFlare', 'w3-total-cache' ),
 | |
| 			'href'   => wp_nonce_url( admin_url( 'admin.php?page=w3tc_dashboard&w3tc_cloudflare_flush' ), 'w3tc' ),
 | |
| 		);
 | |
| 
 | |
| 		return $menu_items;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Check if last check has expired. If so update CloudFlare ips
 | |
| 	 */
 | |
| 	function check_ip_versions() {
 | |
| 		$state = Dispatcher::config_state_master();
 | |
| 
 | |
| 		if ( $state->get_integer( 'extension.cloudflare.next_ips_check' ) < time() ) {
 | |
| 			// update asap to avoid multiple processes entering the check.
 | |
| 			$state->set( 'extension.cloudflare.next_ips_check', time() + 7 * 24 * 60 * 60 );
 | |
| 
 | |
| 			$data = array();
 | |
| 			try {
 | |
| 				$data = $this->api->get_ip_ranges();
 | |
| 			} catch ( \Exception $ex ) {
 | |
| 				// Missing exception handling?
 | |
| 			}
 | |
| 
 | |
| 			if ( isset( $data['ip4'] ) ) {
 | |
| 				$state->set( 'extension.cloudflare.ips.ip4', $data['ip4'] );
 | |
| 			}
 | |
| 
 | |
| 			if ( isset( $data['ip6'] ) ) {
 | |
| 				$state->set( 'extension.cloudflare.ips.ip6', $data['ip6'] );
 | |
| 			}
 | |
| 
 | |
| 			$state->save();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Send CloudFlare API request
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	function action_cloudflare_api_request() {
 | |
| 		$result   = false;
 | |
| 		$response = null;
 | |
| 		$actions  = array(
 | |
| 			'dev_mode',
 | |
| 			'sec_lvl',
 | |
| 			'fpurge_ts',
 | |
| 		);
 | |
| 		$email    = Util_Request::get_string( 'email' );
 | |
| 		$key      = Util_Request::get_string( 'key' );
 | |
| 		$zone     = Util_Request::get_string( 'zone' );
 | |
| 		$action   = Util_Request::get_string( 'command' );
 | |
| 		$value    = Util_Request::get_string( 'value' );
 | |
| 		$nonce    = Util_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 token / global key.';
 | |
| 		} elseif ( ! $zone ) {
 | |
| 			$error = 'Empty zone.';
 | |
| 		} elseif ( strpos( $zone, '.' ) === false ) {
 | |
| 			$error = 'Invalid domain.';
 | |
| 		} elseif ( ! in_array( $action, $actions, true ) ) {
 | |
| 			$error = 'Invalid action.';
 | |
| 		} else {
 | |
| 			$config = array(
 | |
| 				'email' => $email,
 | |
| 				'key'   => $key,
 | |
| 				'zone'  => $zone,
 | |
| 			);
 | |
| 
 | |
| 			@$this->api = new Extension_CloudFlare_Api( $config );
 | |
| 
 | |
| 			@set_time_limit( $this->_config->get_integer( array( 'cloudflare', 'timelimit.api_request' ) ) );
 | |
| 			$response = $this->api->api_request( $action, $value );
 | |
| 
 | |
| 			if ( $response ) {
 | |
| 				if ( 'success' === $response->result ) {
 | |
| 					$result = true;
 | |
| 					$error  = 'OK';
 | |
| 				} else {
 | |
| 					$error = $response->msg;
 | |
| 				}
 | |
| 			} else {
 | |
| 				$error = 'Unable to make CloudFlare API request.';
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$return = array(
 | |
| 			'result'   => $result,
 | |
| 			'error'    => $error,
 | |
| 			'response' => $response,
 | |
| 		);
 | |
| 
 | |
| 		wp_send_json( $return );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * W3TC Dashboard page modifications
 | |
| 	 */
 | |
| 	public function w3tc_admin_actions( $handlers ) {
 | |
| 		$handlers['cloudflare'] = 'Extension_CloudFlare_AdminActions';
 | |
| 		return $handlers;
 | |
| 	}
 | |
| 
 | |
| 	public function admin_print_scripts_w3tc_dashboard() {
 | |
| 		wp_enqueue_script(
 | |
| 			'w3tc_extension_cloudflare_dashboard',
 | |
| 			plugins_url( 'Extension_CloudFlare_View_Dashboard.js', W3TC_FILE ),
 | |
| 			array( 'jquery' ),
 | |
| 			'1.0',
 | |
| 			true
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	public function w3tc_dashboard_actions( $actions ) {
 | |
| 		$email = $this->_config->get_string( array( 'cloudflare', 'email' ) );
 | |
| 		$key   = $this->_config->get_string( array( 'cloudflare', 'key' ) );
 | |
| 
 | |
| 		if ( empty( $email ) || empty( $key ) ) {
 | |
| 			return $actions;
 | |
| 		}
 | |
| 
 | |
| 		$modules            = Dispatcher::component( 'ModuleStatus' );
 | |
| 		$can_empty_memcache = $modules->can_empty_memcache();
 | |
| 		$can_empty_opcode   = $modules->can_empty_opcode();
 | |
| 		$can_empty_file     = $modules->can_empty_file();
 | |
| 		$can_empty_varnish  = $modules->can_empty_varnish();
 | |
| 
 | |
| 		$actions[] = sprintf(
 | |
| 			'<input type="submit" class="dropdown-item" name="w3tc_cloudflare_flush_all_except_cf" value="%1$s"%2$s>',
 | |
| 			esc_attr__( 'Empty All Caches Except CloudFlare', 'w3-total-cache' ),
 | |
| 			( ! $can_empty_memcache && ! $can_empty_opcode && ! $can_empty_file && ! $can_empty_varnish )
 | |
| 				? ' disabled="disabled"' : ''
 | |
| 		);
 | |
| 
 | |
| 		return $actions;
 | |
| 	}
 | |
| 
 | |
| 	public function w3tc_ui_config_item_cdnfsd_enabled( $a ) {
 | |
| 		$c             = Dispatcher::config();
 | |
| 		$cdnfsd_engine = $c->get_string( 'cdnfsd.engine' );
 | |
| 
 | |
| 		// overwrite behavior if controlled by extension.
 | |
| 		if ( empty( $cdnfsd_engine ) || 'cloudflare' === $cdnfsd_engine ) {
 | |
| 			$a['value'] = true;
 | |
| 		}
 | |
| 
 | |
| 		return $a;
 | |
| 	}
 | |
| 
 | |
| 	public function w3tc_ui_config_item_cdnfsd_engine( $a ) {
 | |
| 		$c             = Dispatcher::config();
 | |
| 		$cdnfsd_engine = $c->get_string( 'cdnfsd.engine' );
 | |
| 
 | |
| 		// overwrite behavior if controlled by extension.
 | |
| 		if ( empty( $cdnfsd_engine ) || 'cloudflare' === $cdnfsd_engine ) {
 | |
| 			$a['value'] = 'cloudflare';
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $a['selectbox_values']['cloudflare'] ) ) {
 | |
| 			$a['selectbox_values']['cloudflare']['label']    = 'CloudFlare';
 | |
| 			$a['selectbox_values']['cloudflare']['disabled'] = null;
 | |
| 		}
 | |
| 
 | |
| 		return $a;
 | |
| 	}
 | |
| 
 | |
| 	public function w3tc_settings_general_anchors( $anchors ) {
 | |
| 		$anchors[] = array(
 | |
| 			'id'   => 'cloudflare',
 | |
| 			'text' => 'CloudFlare',
 | |
| 		);
 | |
| 		return $anchors;
 | |
| 	}
 | |
| 
 | |
| 	public function w3tc_settings_general_boxarea_cloudflare() {
 | |
| 		$config = $this->_config;
 | |
| 		include W3TC_DIR . '/Extension_CloudFlare_GeneralPage_View.php';
 | |
| 	}
 | |
| }
 |