Skip to content

Instantly share code, notes, and snippets.

@bhubbard
Created March 13, 2016 19:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save bhubbard/82176b1d64c6b1e8a26f to your computer and use it in GitHub Desktop.
Save bhubbard/82176b1d64c6b1e8a26f to your computer and use it in GitHub Desktop.
<?php
/**
* Make CloudFlare Client API calls via wp_remote_post
* A fork from CloudFlare-API by VEXXHOST, Inc.
*
* @package Sunny
* @subpackage Sunny/includes
* @author Tang Rufus <rufus@wphuman.com>
* @since 1.0.0
* @link https://github.com/vexxhost/CloudFlare-API
* @link https://www.cloudflare.com/docs/client-api.html
*/
class Sunny_CloudFlare_API_Helper {
//The URL of the API
private static $CLOUDFLARE_API_ENDPOINT = 'https://www.cloudflare.com/api_json.html';
//Service mode values.
private static $MODE_SERVICE = array( 'A', 'AAAA', 'CNAME' );
//Prio values.
private static $PRIO = array( 'MX', 'SRV' );
//Stores the api key
private $token_key;
//Stores the email login
private $email;
public function __construct( $email, $token_key )
{
$this->email = sanitize_email( $email );
$this->token_key = sanitize_text_field( $token_key );
}
/**
* CLIENT API
* Section 3
* Access
*/
/**
* 3.1 - Retrieve Domain Statistics For A Given Time Frame
* This function retrieves the current stats and settings for a particular website.
* It can also be used to get currently settings of values such as the security level.
*/
public function stats( $domain, $interval = 20 )
{
$data = array(
'a' => 'stats',
'z' => $domain,
'interval' => $interval
);
return $this->http_post( $data );
}
/**
* 3.2 - Retrieve A List Of The Domains
* This lists all domains in a CloudFlare account along with other data.
*/
public function zone_load_multi()
{
$data = array(
'a' => 'zone_load_multi'
);
return $this->http_post( $data );
}
/**
* 3.3 - Retrieve DNS Records Of A Given Domain
* This function retrieves the current DNS records for a particular website.
*/
public function rec_load_all( $domain )
{
$data = array(
'a' => 'rec_load_all',
'z' => $domain
);
return $this->http_post( $data );
}
/**
* 3.4 - Checks For Active Zones And Returns Their Corresponding Zids
* This function retrieves domain statistics for a given time frame.
*/
public function zone_check( $zones )
{
if ( is_array( $zones ) ) {
$zones = implode( ',', $zones );
}
$data = array(
'a' => 'zone_check',
'zones' => $zones
);
return $this->http_post( $data );
}
/**
* 3.6 - Check The Threat Score For A Given IP
* This function retrieves the current threat score for a given IP.
* Note that scores are on a logarithmic scale, where a higher score indicates a higher threat.
*/
public function threat_score( $ip )
{
$data = array(
'a' => 'ip_lkup',
'ip' => $ip
);
return $this->http_post( $data );
}
/**
* 3.7 - List All The Current Settings
* This function retrieves all the current settings for a given domain.
*/
public function zone_settings( $domain )
{
$data = array(
'a' => 'zone_settings',
'z' => $domain
);
return $this->http_post( $data );
}
/**
* Undocumented method
* SEE: https://github.com/vexxhost/CloudFlare-API/pull/3
*/
public function zone_init( $zone )
{
$data['a'] = 'zone_init';
$data['z'] = $zone;
return $this->http_post( $data );
}
/**
* CLIENT API
* Section 4
* Modify
*/
/**
* 4.1 - Set The Security Level
* This function sets the Basic Security Level to I'M UNDER ATTACK! / HIGH / MEDIUM / LOW / ESSENTIALLY OFF.
* The switches are: (help|high|med|low|eoff).
*/
public function sec_lvl( $domain, $mode )
{
$data = array(
'a' => 'sec_lvl',
'z' => $domain,
'v' => $mode
);
return $this->http_post( $data );
}
/**
* 4.2 - Set The Cache Level
* This function sets the Caching Level to Aggressive or Basic.
* The switches are: (agg|basic).
*/
public function cache_lvl( $domain, $mode )
{
$data = array(
'a' => 'cache_lvl',
'z' => $domain,
'v' => ( 'agg' == strtolower( $mode ) ) ? 'agg' : 'basic'
);
return $this->http_post( $data );
}
/**
* 4.3 - Toggling Development Mode
* This function allows you to toggle Development Mode on or off for a particular domain.
* When Development Mode is on the cache is bypassed.
* Development mode remains on for 3 hours or until when it is toggled back off.
*/
public function devmode( $domain, $mode )
{
$data = array(
'a' => 'devmode',
'z' => $domain,
'v' => ( true == $mode ) ? 1 : 0
);
return $this->http_post( $data );
}
/**
* 4.4 - Clear CloudFlare's Cache
* This function will purge CloudFlare of any cached files.
* It may take up to 48 hours for the cache to rebuild and optimum performance to be achieved.
* This function should be used sparingly.
*/
public function fpurge_ts( $domain )
{
$data = array(
'a' => 'fpurge_ts',
'z' => $domain,
'v' => 1
);
return $this->http_post( $data );
}
/**
* 4.5 - Purge A Single File In CloudFlare's Cache
* This function will purge a single file from CloudFlare's cache.
*/
public function zone_file_purge( $domain, $url )
{
$data = array(
'a' => 'zone_file_purge',
'z' => $domain,
'url' => $url
);
return $this->http_post( $data );
}
/**
* 4.6 - Update The Snapshot Of Your Site
* This snapshot is used on CloudFlare's challenge page
* This function tells CloudFlare to take a new image of your site.
* Note that this call is rate limited to once per zone per day.
* Also the new image may take up to 1 hour to appear.
*/
public function update_image( $zoneid )
{
$data = array(
'a' => 'zone_grab',
'zid' => $zoneid
);
return $this->http_post( $data );
}
/**
* 4.7a - Whitelist IPs
* You can add an IP address to your whitelist.
*/
public function wl( $ip )
{
$data = array(
'a' => 'wl',
'key' => $ip
);
return $this->http_post( $data );
}
/**
* 4.7b - Blacklist IPs
* You can add an IP address to your blacklist.
*/
public function ban( $ip )
{
$data = array(
'a' => 'ban',
'key' => $ip
);
return $this->http_post( $data );
}
/**
* 4.7c - Unlist IPs
* You can remove an IP address from the whitelist and the blacklist.
*/
public function nul( $ip )
{
$data = array(
'a' => 'nul',
'key' => $ip
);
return $this->http_post( $data );
}
/**
* 4.8 - Toggle IPv6 Support
* This function toggles IPv6 support.
*/
public function ipv46( $domain, $mode )
{
$data = array(
'a' => 'ipv46',
'z' => $domain,
'v' => ( true == $mode ) ? 1 : 0
);
return $this->http_post( $data );
}
/**
* 4.9 - Set Rocket Loader
* This function changes Rocket Loader setting.
*/
public function async( $domain, $mode )
{
$data = array(
'a' => 'async',
'z' => $domain,
'v' => $mode
);
return $this->http_post( $data );
}
/**
* 4.10 - Set Minification
* This function changes minification settings.
*/
public function minify( $domain, $mode )
{
$data = array(
'a' => 'minify',
'z' => $domain,
'v' => $mode
);
return $this->http_post( $data );
}
/**
* CLIENT API
* Section 5
* DNS Record Management
*/
/**
* 5.1 - Add A New DNS Record
* This function creates a new DNS record for a zone.
* See http://www.cloudflare.com/docs/client-api.html#s5.1 for documentation.
*/
public function rec_new( $domain, $type, $name, $content, $ttl = 1, $mode = 1, $prio = 1, $service = 1, $srvname = 1, $protocol = 1, $weight = 1, $port = 1, $target = 1 )
{
$data = array(
'a' => 'rec_new',
'z' => $domain,
'type' => $type,
'name' => $name,
'content' => $content,
'ttl' => $ttl
);
if ( in_array( $type, self::$MODE_SERVICE ) )
$data['service_mode'] = ( true == $mode ) ? 1 : 0;
elseif ( in_array( $type, self::$PRIO ) ) {
$data['prio'] = $prio;
if ( $type == 'SRV' ) {
$data = array_merge( $data, array(
'service' => $service,
'srvname' => $srvname,
'protocol' => $protocol,
'weight' => $weight,
'port' => $port,
'target' => $target
) );
}
}
return $this->http_post( $data );
}
/**
* 5.2 - Edit A DNS Record
* This function edits a DNS record for a zone.
* See http://www.cloudflare.com/docs/client-api.html#s5.1 for documentation.
*/
public function rec_edit( $domain, $type, $id, $name, $content, $ttl = 1, $mode = 1, $prio = 1, $service = 1, $srvname = 1, $protocol = 1, $weight = 1, $port = 1, $target = 1 )
{
$data = array(
'a' => 'rec_edit',
'z' => $domain,
'type' => $type,
'id' => $id,
'name' => $name,
'content' => $content,
'ttl' => $ttl
);
if ( in_array( $type, self::$MODE_SERVICE ) )
$data['service_mode'] = ( true == $mode ) ? 1 : 0;
elseif ( in_array( $type, self::$PRIO ) ) {
$data['prio'] = $prio;
if ( 'SRV' == $type ) {
$data = array_merge( $data, array(
'service' => $service,
'srvname' => $srvname,
'protocol' => $protocol,
'weight' => $weight,
'port' => $port,
'target' => $target
) );
}
}
return $this->http_post( $data );
}
/**
* 5.3 - Delete A DNS Record
* This function deletes a DNS record for a zone.
* $zone = zone
* $id = The DNS Record ID (Available by using the rec_load_all call)
* $type = A|CNAME
*/
public function delete_dns_record( $domain, $id )
{
$data = array(
'a' => 'rec_delete',
'z' => $domain,
'id' => $id
);
return $this->http_post( $data );
}
/**
* GLOBAL API CALL
* HTTP POST a specific task with the supplied data
*/
private function http_post( $data )
{
$data['email'] = $this->email;
$data['tkn'] = $this->token_key;
$response = wp_remote_post(
self::$CLOUDFLARE_API_ENDPOINT,
array(
'body' => $data
)
);
do_action( 'sunny_after_cloudflare_api_request', $response, $data );
return $response;
}
}
<?php
public function apiResponse($response)
{
$response_code = $response['response']['code'];
$err_message = false;
if (is_numeric($response_code)) {
switch ($response_code) {
case 200:$err_message = __('Your request was successful.','cloudflare');
break;
case 304:$err_message = __('Not Modified.','cloudflare');
break;
case 400:$err_message = __('Bad Request, request was invalid.','cloudflare');
break;
case 401:$err_message = __('Unauthorized, user does not have permission.','cloudflare');
break;
case 403:$err_message = __('Forbidden, request not authenticated.','cloudflare');
break;
case 429:$err_message = __('Too many requests, client is rate limited.','cloudflare');
break;
case 405:$err_message = __('Method Not Allowed, incorrect HTTP method provided.','cloudflare');
break;
case 415:$err_message = __('Unsupported Media Type, response is not valid JSON.','cloudflare');
}
}
return array("code" => $response_code, "error" => $err_message);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment