laipower/wp-content/plugins/w3-total-cache/Cdn_Highwinds_Popup.php

272 lines
7.1 KiB
PHP

<?php
namespace W3TC;
class Cdn_Highwinds_Popup {
static public function w3tc_ajax() {
$o = new Cdn_Highwinds_Popup();
add_action( 'w3tc_ajax_cdn_highwinds_authenticate',
array( $o, 'w3tc_ajax_cdn_highwinds_authenticate' ) );
add_action( 'w3tc_ajax_cdn_highwinds_select_host',
array( $o, 'w3tc_ajax_cdn_highwinds_select_host' ) );
add_action( 'w3tc_ajax_cdn_highwinds_configure_host',
array( $o, 'w3tc_ajax_cdn_highwinds_configure_host' ) );
add_action( 'w3tc_ajax_cdn_highwinds_configure_cnames_form',
array( $o, 'w3tc_ajax_cdn_highwinds_configure_cnames_form' ) );
add_action( 'w3tc_ajax_cdn_highwinds_configure_cnames',
array( $o, 'w3tc_ajax_cdn_highwinds_configure_cnames' ) );
}
public function w3tc_ajax_cdn_highwinds_authenticate() {
$details = array();
include W3TC_DIR . '/Cdn_Highwinds_Popup_View_Intro.php';
exit();
}
public function w3tc_ajax_cdn_highwinds_select_host() {
$api_token = Util_Request::get_string( 'api_token' );
try {
$user = Cdn_Highwinds_Api::users_me( $api_token );
$account_hash = $user['accountHash'];
// obtain hosts
$api = new Cdn_Highwinds_Api( $account_hash, $api_token );
$hosts_response = $api->hosts();
} catch ( \Exception $ex ) {
$details = array(
'error_message' => 'Can\'t authenticate: ' . $ex->getMessage()
);
include W3TC_DIR . '/Cdn_Highwinds_Popup_View_Intro.php';
exit();
}
$details = array(
'account_hash' => $account_hash,
'api_token' => $api_token,
'hosts' => $hosts_response['list']
);
include W3TC_DIR . '/Cdn_Highwinds_Popup_View_SelectHost.php';
exit();
}
public function w3tc_ajax_cdn_highwinds_configure_host() {
$account_hash = Util_Request::get_string( 'account_hash' );
$api_token = Util_Request::get_string( 'api_token' );
$host = Util_Request::get( 'host', '' );
$details = array(
'account_hash' => $account_hash,
'api_token' => $api_token
);
$api = new Cdn_Highwinds_Api( $account_hash, $api_token );
try {
if ( empty( $host ) ) {
$host = $this->_create_host( $api, Util_Request::get_string( 'host_new' ) );
}
} catch ( \Exception $ex ) {
$api_hosts = $api->hosts();
$details['hosts'] = $api_hosts['list'];
$details['error_message'] = $ex->getMessage();
include W3TC_DIR . '/Cdn_Highwinds_Popup_View_SelectHost.php';
exit();
}
// try to obtain CNAMEs
$c = Dispatcher::config();
try {
$scopes_response = $api->configure_scopes( $host );
$scope_id = 0;
foreach ( $scopes_response['list'] as $scope ) {
if ( $scope['platform'] == 'CDS' )
$scope_id = $scope['id'];
}
if ( $scope_id <= 0 )
throw new Exception( 'scope CDN hasnt been created' );
$configuration = $api->configure_scope_get( $host, $scope_id );
if ( isset( $configuration['hostname'] ) ) {
$domains = array();
foreach ( $configuration['hostname'] as $d )
$domains[] = $d['domain'];
$c->set( 'cdn.highwinds.host.domains', $domains );
}
} catch ( \Exception $ex ) {
}
$c->set( 'cdn.highwinds.account_hash', $account_hash );
$c->set( 'cdn.highwinds.api_token', $api_token );
$c->set( 'cdn.highwinds.host.hash_code', $host );
$c->save();
$postfix = Util_Admin::custom_message_id( array(),
array(
'cdn_configuration_saved' =>
'CDN credentials are saved successfully' ) );
echo 'Location admin.php?page=w3tc_cdn&' . esc_html( $postfix );
exit();
}
private function _create_host( $api, $host_name ) {
// create simple host
$services_response = $api->services();
// select all CDS services since its going to use caching
$service_ids = array();
foreach ( $services_response['list'] as $s ) {
if ( strpos( $s['name'], 'CDS' ) >= 0 )
$service_ids[] = $s['id'];
}
$origins_response = $api->origins();
$home_domain = Util_Environment::home_url_host();
$origin_id = 0;
foreach ( $origins_response['list'] as $o ) {
if ( $o['hostname'] == $home_domain ) {
$origin_id = $o['id'];
break;
}
}
if ( $origin_id == 0 ) {
try {
$name = preg_replace( '/[^0-9a-z]/', '_', $home_domain );
$origin_response = $api->origin_add( array(
'name' => $name,
'hostname' => $home_domain,
'path' => '/',
'port' => 80
) );
$origin_id = $origin_response['id'];
} catch ( \Exception $ex ) {
throw new \Exception( 'Can\'t create origin ' . $home_domain . ': ' .
$ex->getMessage() );
}
}
try {
// create host
$host_response = $api->host_add( array(
'name' => Util_Request::get_string( 'host_new' ),
'services' => $service_ids
) );
$host = $host_response['hashCode'];
} catch ( \Exception $ex ) {
throw new \Exception( 'Can\'t create new host: ' . $ex->getMessage() );
}
// configure host
$scopes_response = $api->configure_scopes( $host );
$scope_id = 0;
foreach ( $scopes_response['list'] as $scope ) {
if ( $scope['platform'] == 'CDS' )
$scope_id = $scope['id'];
}
if ( $scope_id <= 0 )
throw new Exception( 'Cant\'t configure host - scope CDN hasnt been created' );
$configuration = $api->configure_scope_get( $host, $scope_id );
// apply usually optimal default values
$configuration['cacheControl'] = array( array( 'maxAge' => 31536000 ) );
$configuration['compression'] = array( 'gzip' => 'css,js' );
$configuration['originPullCacheExtension'] = array(
'expiredCacheExtension' => 86400 );
$configuration['originPullHost'] = array( 'primary' => $origin_id );
$configuration['originPullPolicy'] = array( array(
'expirePolicy' => 'CACHE_CONTROL',
'expireSeconds' => 86400,
'httpHeaders' => 'Access-Control-Allow-Origin'
) );
try {
$configuration_response = $api->configure_scope_set( $host,
$scope_id, $configuration );
} catch ( \Exception $ex ) {
throw new \Exception( 'Cant\'t configure host: ' . $ex->getMessage() );
}
return $host;
}
public function w3tc_ajax_cdn_highwinds_configure_cnames_form() {
$this->render_configure_cnames_form();
exit();
}
public function w3tc_ajax_cdn_highwinds_configure_cnames() {
$details = array(
'cnames' => Util_Request::get_array( 'cdn_cnames' )
);
$core = Dispatcher::component( 'Cdn_Core' );
$cdn = $core->get_cdn();
try {
// try to obtain CNAMEs
$cdn->service_cnames_set( $details['cnames'] );
$c = Dispatcher::config();
$c->set( 'cdn.highwinds.host.domains', $details['cnames'] );
$c->save();
$postfix = Util_Admin::custom_message_id( array(),
array( 'cdn_cnames_saved' => 'CNAMEs are saved successfully' ) );
echo 'Location admin.php?page=w3tc_cdn&' . esc_html( $postfix );
exit();
} catch ( \Exception $ex ) {
$details['error_message'] = $ex->getMessage();
}
$this->render_configure_cnames_form( $details );
exit();
}
private function render_configure_cnames_form( $details = array() ) {
if ( isset( $details['cnames'] ) )
$cnames = $details['cnames'];
else {
$core = Dispatcher::component( 'Cdn_Core' );
$cdn = $core->get_cdn();
try {
// try to obtain CNAMEs
$cnames = $cdn->service_cnames_get();
} catch ( \Exception $ex ) {
$details['error_message'] = $ex->getMessage();
$cnames = array();
}
}
include W3TC_DIR . '/Cdn_Highwinds_Popup_View_ConfigureCnamesForm.php';
}
}