File "cloudways.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/really-simple-ssl/lets-encrypt/integrations/cloudways/cloudways.php
File
size: 7.98 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
class rsssl_Cloudways
{
private $email;
private $api_key;
public $ssl_installation_url;
public function __construct()
{
$this->email = rsssl_get_value('cloudways_user_email');
$this->api_key = RSSSL_LE()->letsencrypt_handler->decode(rsssl_get_value('cloudways_api_key'));
$this->ssl_installation_url = "";
}
private function callCloudwaysAPI($method, $url, $accessToken, $post = array())
{
$baseURL = 'https://api.cloudways.com/api/v1/';
try {
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_URL, $baseURL . $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if ($accessToken) {
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . $accessToken]);
}
$encoded = '';
if (count($post)) {
foreach ($post as $name => $value) {
if (is_array($value)) {
foreach ($value as $sub_value) {
$encoded .= $name . '[]=' . urlencode($sub_value) . '&';
}
} else {
$encoded .= urlencode($name) . '=' . urlencode($value) . '&';
}
}
$encoded = substr($encoded, 0, strlen($encoded) - 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded);
curl_setopt($ch, CURLOPT_POST, 1);
}
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($output && isset($output->error_description)) {
return new RSSSL_RESPONSE('error', 'stop', $output->error_description, false);
} else {
if ($httpcode != '200' && $output && isset($output->message)) {
return new RSSSL_RESPONSE('error', 'stop', $output->message);
} else {
if ($httpcode != '200') {
$message = $httpcode . ' output: ' . substr($output, 0, 10000);
error_log(print_r($message, true));
return new RSSSL_RESPONSE('error', 'stop', $message);
}
}
}
curl_close($ch);
return new RSSSL_RESPONSE('success', 'continue', '', json_decode($output));
} catch (Exception $e) {
error_log(print_r($e, true));
return new RSSSL_RESPONSE('error', 'stop', $e->getMessage());
}
}
private function getAccessToken()
{
error_log("try retrieving access token");
$accessToken = get_transient('rsssl_cw_t');
if (!$accessToken) {
error_log("not found, get new");
$response = $this->callCloudwaysAPI('POST', '/oauth/access_token', null, ['email' => $this->email, 'api_key' => $this->api_key]);
error_log("api call output");
error_log(print_r($response, true));
if ($response->status === 'success') {
$accessToken = $response->output->access_token;
set_transient('rsssl_cw_t', $accessToken, 1800);
} else {
return new RSSSL_RESPONSE('error', 'stop', $response->message);
}
}
return new RSSSL_RESPONSE('success', 'continue', '', $accessToken);
}
public function installSSL($domains)
{
error_log("starting installation");
$response = $this->getAccessToken();
if ($response->status !== 'success') {
return new RSSSL_RESPONSE('error', 'stop', $response->message);
}
$accessToken = $response->output;
$response = $this->getServerInfo();
if ($response->status === 'success') {
$server_id = get_transient('rsssl_cw_server_id');
$app_id = get_transient('rsssl_cw_app_id');
$args = ['server_id' => $server_id, 'app_id' => $app_id, 'ssl_email' => $this->email, 'wild_card' => RSSSL_LE()->letsencrypt_handler->is_wildcard(), 'ssl_domains' => $domains];
$response = $this->callCloudWaysAPI('POST', 'security/lets_encrypt_install', $accessToken, $args);
}
return $response;
}
public function enableAutoRenew()
{
$response = $this->getAccessToken();
if ($response->status !== 'success') {
return new RSSSL_RESPONSE('error', 'stop', __("Failed retrieving access token", "really-simple-ssl"));
}
$accessToken = $response->output;
$response = $this->getServerInfo();
if ($response->status === 'success') {
$app_id = get_transient('rsssl_cw_app_id');
$server_id = get_transient('rsssl_cw_server_id');
$response = $this->callCloudWaysAPI('POST', 'security/lets_encrypt_auto', $accessToken, ['server_id' => $server_id, 'app_id' => $app_id, 'auto' => true]);
}
if ($response->status === 'success') {
$status = 'success';
$action = 'continue';
$message = __("Successfully installed Let's Encrypt", "really-simple-ssl");
} elseif ($response->status === 'error') {
if (strpos($response->message, 'An operation is already in progress for this server')) {
$status = 'success';
$action = 'continue';
$message = __("Successfully installed Let's Encrypt", "really-simple-ssl");
} else {
$status = $response->status;
$action = $response->action;
$message = $response->message;
}
} else {
$status = $response->status;
$action = $response->action;
$message = __("Error enabling auto renew for Let's Encrypt", "really-simple-ssl");
}
return new RSSSL_RESPONSE($status, $action, $message);
}
public function getServerInfo()
{
if (get_transient('rsssl_cw_app_id') && get_transient('rsssl_cw_server_id')) {
$status = 'success';
$action = 'continue';
$message = __("Successfully retrieved server id and app id", "really-simple-ssl");
return new RSSSL_RESPONSE($status, $action, $message);
}
$response = $this->getAccessToken();
if ($response->status !== 'success') {
return new RSSSL_RESPONSE('error', 'stop', $response->message);
}
$accessToken = $response->output;
$response = $this->callCloudwaysAPI('GET', '/server', $accessToken);
$success = false;
if ($response->status === 'success') {
$serverList = $response->output;
$servers = $serverList->servers;
error_log(print_r($servers, true));
foreach ($servers as $server) {
$apps = $server->apps;
foreach ($apps as $app) {
$app_domain = $app->cname;
error_log("app domain " . $app_domain);
$this_site_domain = str_replace(array('https://', 'http://', 'www.'), '', site_url());
if (strpos($app_domain, $this_site_domain) !== false) {
$success = true;
set_transient('rsssl_cw_app_id', $app->id, WEEK_IN_SECONDS);
set_transient('rsssl_cw_server_id', $server->id, WEEK_IN_SECONDS);
break 2;
}
}
}
}
if ($success) {
$status = 'success';
$action = 'continue';
$message = __("Successfully retrieved server id and app id", "really-simple-ssl");
} else {
$status = 'error';
$action = 'stop';
if (isset($serverList->error_description)) {
$message = $serverList->error_description;
} else {
$message = __("Could not retrieve server list", "really-simple-ssl");
}
}
return new RSSSL_RESPONSE($status, $action, $message);
}
}